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