1faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase/* 2d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount * Copyright (C) 2014 The Android Open Source Project 3faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * 4faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * Licensed under the Apache License, Version 2.0 (the "License"); 5faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * you may not use this file except in compliance with the License. 6faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * You may obtain a copy of the License at 7faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * 8faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * http://www.apache.org/licenses/LICENSE-2.0 9faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * 10faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * Unless required by applicable law or agreed to in writing, software 11faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * distributed under the License is distributed on an "AS IS" BASIS, 12faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * See the License for the specific language governing permissions and 14faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * limitations under the License. 15faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */ 16d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haasepackage android.transition; 17faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 18faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.animation.Animator; 19faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.animation.TimeInterpolator; 207764b920f21e0b9250122ff26533d5dac98df6b3George Mountimport android.annotation.IntDef; 21ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mountimport android.content.Context; 22ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mountimport android.content.res.TypedArray; 23ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mountimport android.util.AttributeSet; 24dc21d3b2804c24fe29ec860796d11185901364c4George Mountimport android.view.Gravity; 25faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.view.View; 26faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.view.ViewGroup; 27faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.view.animation.AccelerateInterpolator; 28faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.view.animation.DecelerateInterpolator; 29ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mountimport com.android.internal.R; 30faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 317764b920f21e0b9250122ff26533d5dac98df6b3George Mountimport java.lang.annotation.Retention; 327764b920f21e0b9250122ff26533d5dac98df6b3George Mountimport java.lang.annotation.RetentionPolicy; 337764b920f21e0b9250122ff26533d5dac98df6b3George Mount 34faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase/** 35d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount * This transition tracks changes to the visibility of target views in the 36d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount * start and end scenes and moves views in or out from one of the edges of the 37d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount * scene. Visibility is determined by both the 38d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount * {@link View#setVisibility(int)} state of the view as well as whether it 39d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount * is parented in the current view hierarchy. Disappearing Views are 40d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount * limited as described in {@link Visibility#onDisappear(android.view.ViewGroup, 41d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount * TransitionValues, int, TransitionValues, int)}. 42faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */ 43faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haasepublic class Slide extends Visibility { 44d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount private static final String TAG = "Slide"; 45d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount private static final TimeInterpolator sDecelerate = new DecelerateInterpolator(); 46d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount private static final TimeInterpolator sAccelerate = new AccelerateInterpolator(); 471f8c01181bcdef6e7e7e359ecde003939523b718George Mount private static final String PROPNAME_SCREEN_POSITION = "android:slide:screenPosition"; 48d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount private CalculateSlide mSlideCalculator = sCalculateBottom; 497764b920f21e0b9250122ff26533d5dac98df6b3George Mount private @GravityFlag int mSlideEdge = Gravity.BOTTOM; 50cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler private float mSlideFraction = 1; 517764b920f21e0b9250122ff26533d5dac98df6b3George Mount 527764b920f21e0b9250122ff26533d5dac98df6b3George Mount /** @hide */ 537764b920f21e0b9250122ff26533d5dac98df6b3George Mount @Retention(RetentionPolicy.SOURCE) 547764b920f21e0b9250122ff26533d5dac98df6b3George Mount @IntDef({Gravity.LEFT, Gravity.TOP, Gravity.RIGHT, Gravity.BOTTOM, Gravity.START, Gravity.END}) 557764b920f21e0b9250122ff26533d5dac98df6b3George Mount public @interface GravityFlag {} 56d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount 57d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount private interface CalculateSlide { 58d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount 591f8c01181bcdef6e7e7e359ecde003939523b718George Mount /** Returns the translation value for view when it goes out of the scene */ 60cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler float getGoneX(ViewGroup sceneRoot, View view, float fraction); 61d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount 621f8c01181bcdef6e7e7e359ecde003939523b718George Mount /** Returns the translation value for view when it goes out of the scene */ 63cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler float getGoneY(ViewGroup sceneRoot, View view, float fraction); 64d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount } 65d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount 66d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount private static abstract class CalculateSlideHorizontal implements CalculateSlide { 67d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount 68d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount @Override 69cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler public float getGoneY(ViewGroup sceneRoot, View view, float fraction) { 701f8c01181bcdef6e7e7e359ecde003939523b718George Mount return view.getTranslationY(); 71d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount } 72d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount } 73d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount 74d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount private static abstract class CalculateSlideVertical implements CalculateSlide { 75d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount 76d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount @Override 77cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler public float getGoneX(ViewGroup sceneRoot, View view, float fraction) { 781f8c01181bcdef6e7e7e359ecde003939523b718George Mount return view.getTranslationX(); 79d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount } 80d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount } 81d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount 82d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount private static final CalculateSlide sCalculateLeft = new CalculateSlideHorizontal() { 83d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount @Override 84cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler public float getGoneX(ViewGroup sceneRoot, View view, float fraction) { 85cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler return view.getTranslationX() - sceneRoot.getWidth() * fraction; 86d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount } 87d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount }; 88d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount 892db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount private static final CalculateSlide sCalculateStart = new CalculateSlideHorizontal() { 902db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount @Override 91cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler public float getGoneX(ViewGroup sceneRoot, View view, float fraction) { 922db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount final boolean isRtl = sceneRoot.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL; 932db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount final float x; 942db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount if (isRtl) { 95cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler x = view.getTranslationX() + sceneRoot.getWidth() * fraction; 962db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount } else { 97cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler x = view.getTranslationX() - sceneRoot.getWidth() * fraction; 982db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount } 992db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount return x; 1002db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount } 1012db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount }; 1022db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount 103d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount private static final CalculateSlide sCalculateTop = new CalculateSlideVertical() { 104d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount @Override 105cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler public float getGoneY(ViewGroup sceneRoot, View view, float fraction) { 106cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler return view.getTranslationY() - sceneRoot.getHeight() * fraction; 107d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount } 108d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount }; 109d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount 110d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount private static final CalculateSlide sCalculateRight = new CalculateSlideHorizontal() { 111d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount @Override 112cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler public float getGoneX(ViewGroup sceneRoot, View view, float fraction) { 113cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler return view.getTranslationX() + sceneRoot.getWidth() * fraction; 114d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount } 115d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount }; 116d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount 1172db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount private static final CalculateSlide sCalculateEnd = new CalculateSlideHorizontal() { 1182db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount @Override 119cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler public float getGoneX(ViewGroup sceneRoot, View view, float fraction) { 1202db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount final boolean isRtl = sceneRoot.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL; 1212db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount final float x; 1222db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount if (isRtl) { 123cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler x = view.getTranslationX() - sceneRoot.getWidth() * fraction; 1242db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount } else { 125cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler x = view.getTranslationX() + sceneRoot.getWidth() * fraction; 1262db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount } 1272db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount return x; 1282db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount } 1292db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount }; 1302db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount 131d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount private static final CalculateSlide sCalculateBottom = new CalculateSlideVertical() { 132d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount @Override 133cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler public float getGoneY(ViewGroup sceneRoot, View view, float fraction) { 134cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler return view.getTranslationY() + sceneRoot.getHeight() * fraction; 135d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount } 136d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount }; 137d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount 138d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount /** 139dc21d3b2804c24fe29ec860796d11185901364c4George Mount * Constructor using the default {@link Gravity#BOTTOM} 140d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount * slide edge direction. 141d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount */ 142d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount public Slide() { 143dc21d3b2804c24fe29ec860796d11185901364c4George Mount setSlideEdge(Gravity.BOTTOM); 144d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount } 145d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount 146d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount /** 147d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount * Constructor using the provided slide edge direction. 148d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount */ 149d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount public Slide(int slideEdge) { 150d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount setSlideEdge(slideEdge); 151d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount } 152d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount 153ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount public Slide(Context context, AttributeSet attrs) { 154ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount super(context, attrs); 155ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Slide); 156ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount int edge = a.getInt(R.styleable.Slide_slideEdge, Gravity.BOTTOM); 157ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount a.recycle(); 158ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount setSlideEdge(edge); 159ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount } 160ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount 1611f8c01181bcdef6e7e7e359ecde003939523b718George Mount private void captureValues(TransitionValues transitionValues) { 1621f8c01181bcdef6e7e7e359ecde003939523b718George Mount View view = transitionValues.view; 1631f8c01181bcdef6e7e7e359ecde003939523b718George Mount int[] position = new int[2]; 1641f8c01181bcdef6e7e7e359ecde003939523b718George Mount view.getLocationOnScreen(position); 1651f8c01181bcdef6e7e7e359ecde003939523b718George Mount transitionValues.values.put(PROPNAME_SCREEN_POSITION, position); 1661f8c01181bcdef6e7e7e359ecde003939523b718George Mount } 1671f8c01181bcdef6e7e7e359ecde003939523b718George Mount 1681f8c01181bcdef6e7e7e359ecde003939523b718George Mount @Override 1691f8c01181bcdef6e7e7e359ecde003939523b718George Mount public void captureStartValues(TransitionValues transitionValues) { 1701f8c01181bcdef6e7e7e359ecde003939523b718George Mount super.captureStartValues(transitionValues); 1711f8c01181bcdef6e7e7e359ecde003939523b718George Mount captureValues(transitionValues); 1721f8c01181bcdef6e7e7e359ecde003939523b718George Mount } 1731f8c01181bcdef6e7e7e359ecde003939523b718George Mount 1741f8c01181bcdef6e7e7e359ecde003939523b718George Mount @Override 1751f8c01181bcdef6e7e7e359ecde003939523b718George Mount public void captureEndValues(TransitionValues transitionValues) { 1761f8c01181bcdef6e7e7e359ecde003939523b718George Mount super.captureEndValues(transitionValues); 1771f8c01181bcdef6e7e7e359ecde003939523b718George Mount captureValues(transitionValues); 1781f8c01181bcdef6e7e7e359ecde003939523b718George Mount } 1791f8c01181bcdef6e7e7e359ecde003939523b718George Mount 180d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount /** 181d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount * Change the edge that Views appear and disappear from. 1821f8c01181bcdef6e7e7e359ecde003939523b718George Mount * 183dc21d3b2804c24fe29ec860796d11185901364c4George Mount * @param slideEdge The edge of the scene to use for Views appearing and disappearing. One of 184dc21d3b2804c24fe29ec860796d11185901364c4George Mount * {@link android.view.Gravity#LEFT}, {@link android.view.Gravity#TOP}, 1852db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount * {@link android.view.Gravity#RIGHT}, {@link android.view.Gravity#BOTTOM}, 1862db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount * {@link android.view.Gravity#START}, {@link android.view.Gravity#END}. 187ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * @attr ref android.R.styleable#Slide_slideEdge 188d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount */ 1897764b920f21e0b9250122ff26533d5dac98df6b3George Mount public void setSlideEdge(@GravityFlag int slideEdge) { 190d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount switch (slideEdge) { 191dc21d3b2804c24fe29ec860796d11185901364c4George Mount case Gravity.LEFT: 192d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount mSlideCalculator = sCalculateLeft; 193d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount break; 194dc21d3b2804c24fe29ec860796d11185901364c4George Mount case Gravity.TOP: 195d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount mSlideCalculator = sCalculateTop; 196d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount break; 197dc21d3b2804c24fe29ec860796d11185901364c4George Mount case Gravity.RIGHT: 198d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount mSlideCalculator = sCalculateRight; 199d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount break; 200dc21d3b2804c24fe29ec860796d11185901364c4George Mount case Gravity.BOTTOM: 201d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount mSlideCalculator = sCalculateBottom; 202d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount break; 2032db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount case Gravity.START: 2042db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount mSlideCalculator = sCalculateStart; 2052db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount break; 2062db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount case Gravity.END: 2072db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount mSlideCalculator = sCalculateEnd; 2082db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount break; 209d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount default: 210d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount throw new IllegalArgumentException("Invalid slide direction"); 211d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount } 212ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount mSlideEdge = slideEdge; 213d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount SidePropagation propagation = new SidePropagation(); 214d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount propagation.setSide(slideEdge); 215d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount setPropagation(propagation); 216d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount } 217d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount 218ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount /** 219ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * Returns the edge that Views appear and disappear from. 220ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * 221ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * @return the edge of the scene to use for Views appearing and disappearing. One of 222ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * {@link android.view.Gravity#LEFT}, {@link android.view.Gravity#TOP}, 2232db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount * {@link android.view.Gravity#RIGHT}, {@link android.view.Gravity#BOTTOM}, 2242db3bf5c49ebcd56f02f10145aa40b2445f6be06George Mount * {@link android.view.Gravity#START}, {@link android.view.Gravity#END}. 225ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * @attr ref android.R.styleable#Slide_slideEdge 226ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount */ 2277764b920f21e0b9250122ff26533d5dac98df6b3George Mount @GravityFlag 228ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount public int getSlideEdge() { 229ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount return mSlideEdge; 230ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount } 231ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount 232faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase @Override 233d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount public Animator onAppear(ViewGroup sceneRoot, View view, 234d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount TransitionValues startValues, TransitionValues endValues) { 235d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount if (endValues == null) { 236d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount return null; 237d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount } 2381f8c01181bcdef6e7e7e359ecde003939523b718George Mount int[] position = (int[]) endValues.values.get(PROPNAME_SCREEN_POSITION); 2391f8c01181bcdef6e7e7e359ecde003939523b718George Mount float endX = view.getTranslationX(); 2401f8c01181bcdef6e7e7e359ecde003939523b718George Mount float endY = view.getTranslationY(); 241cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler float startX = mSlideCalculator.getGoneX(sceneRoot, view, mSlideFraction); 242cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler float startY = mSlideCalculator.getGoneY(sceneRoot, view, mSlideFraction); 2431f8c01181bcdef6e7e7e359ecde003939523b718George Mount return TranslationAnimationCreator 2441f8c01181bcdef6e7e7e359ecde003939523b718George Mount .createAnimation(view, endValues, position[0], position[1], 245727a6cf6ad06bbb43c0c309c33776394a0012895George Mount startX, startY, endX, endY, sDecelerate, this); 246faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase } 247faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase 248d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount @Override 249d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount public Animator onDisappear(ViewGroup sceneRoot, View view, 250d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount TransitionValues startValues, TransitionValues endValues) { 2511f8c01181bcdef6e7e7e359ecde003939523b718George Mount if (startValues == null) { 2521f8c01181bcdef6e7e7e359ecde003939523b718George Mount return null; 253d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount } 2541f8c01181bcdef6e7e7e359ecde003939523b718George Mount int[] position = (int[]) startValues.values.get(PROPNAME_SCREEN_POSITION); 2551f8c01181bcdef6e7e7e359ecde003939523b718George Mount float startX = view.getTranslationX(); 2561f8c01181bcdef6e7e7e359ecde003939523b718George Mount float startY = view.getTranslationY(); 257cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler float endX = mSlideCalculator.getGoneX(sceneRoot, view, mSlideFraction); 258cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler float endY = mSlideCalculator.getGoneY(sceneRoot, view, mSlideFraction); 2591f8c01181bcdef6e7e7e359ecde003939523b718George Mount return TranslationAnimationCreator 2601f8c01181bcdef6e7e7e359ecde003939523b718George Mount .createAnimation(view, startValues, position[0], position[1], 261727a6cf6ad06bbb43c0c309c33776394a0012895George Mount startX, startY, endX, endY, sAccelerate, this); 262d6107a3170df61d9e776fcd5666acfc9135c6f16George Mount } 263cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler 264cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler /** @hide */ 265cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler public void setSlideFraction(float slideFraction) { 266cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler mSlideFraction = slideFraction; 267cfa15bd1d532830954a5f9717c05e3fe19bc512aTony Mantler } 268faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase} 269