SlideKitkat.java revision 4735bfcd924fec2d694523f34fac5f8151257dc7
12f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu/* 22f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu * Copyright (C) 2014 The Android Open Source Project 32f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu * 42f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu * Licensed under the Apache License, Version 2.0 (the "License"); 52f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu * you may not use this file except in compliance with the License. 62f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu * You may obtain a copy of the License at 72f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu * 82f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu * http://www.apache.org/licenses/LICENSE-2.0 92f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu * 102f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu * Unless required by applicable law or agreed to in writing, software 112f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu * distributed under the License is distributed on an "AS IS" BASIS, 122f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu * See the License for the specific language governing permissions and 142f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu * limitations under the License. 152f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu */ 1695400e6d31a1ac09e48cb8944a79b7250484aa4cDake Gupackage android.support.v17.leanback.transition; 172f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 182f97594742886d045ca1ce409ebc6e6e780452f6Dake Guimport android.animation.Animator; 192f97594742886d045ca1ce409ebc6e6e780452f6Dake Guimport android.animation.AnimatorListenerAdapter; 202f97594742886d045ca1ce409ebc6e6e780452f6Dake Guimport android.animation.AnimatorSet; 212f97594742886d045ca1ce409ebc6e6e780452f6Dake Guimport android.animation.ObjectAnimator; 222f97594742886d045ca1ce409ebc6e6e780452f6Dake Guimport android.animation.TimeInterpolator; 232f97594742886d045ca1ce409ebc6e6e780452f6Dake Guimport android.animation.ValueAnimator; 244735bfcd924fec2d694523f34fac5f8151257dc7Dake Guimport android.content.Context; 254735bfcd924fec2d694523f34fac5f8151257dc7Dake Guimport android.content.res.TypedArray; 262f97594742886d045ca1ce409ebc6e6e780452f6Dake Guimport android.graphics.Rect; 274735bfcd924fec2d694523f34fac5f8151257dc7Dake Guimport android.util.AttributeSet; 282f97594742886d045ca1ce409ebc6e6e780452f6Dake Guimport android.util.Log; 292f97594742886d045ca1ce409ebc6e6e780452f6Dake Guimport android.util.Property; 304735bfcd924fec2d694523f34fac5f8151257dc7Dake Guimport android.view.Gravity; 312f97594742886d045ca1ce409ebc6e6e780452f6Dake Guimport android.view.View; 322f97594742886d045ca1ce409ebc6e6e780452f6Dake Guimport android.view.ViewGroup; 332f97594742886d045ca1ce409ebc6e6e780452f6Dake Guimport android.view.animation.AccelerateInterpolator; 344735bfcd924fec2d694523f34fac5f8151257dc7Dake Guimport android.view.animation.AnimationUtils; 352f97594742886d045ca1ce409ebc6e6e780452f6Dake Guimport android.view.animation.DecelerateInterpolator; 362f97594742886d045ca1ce409ebc6e6e780452f6Dake Guimport android.transition.Visibility; 372f97594742886d045ca1ce409ebc6e6e780452f6Dake Guimport android.transition.Transition; 382f97594742886d045ca1ce409ebc6e6e780452f6Dake Guimport android.transition.TransitionValues; 3933f66eb67b6457ea75434dfd9f79703ad9e03560Dake Guimport android.support.v17.leanback.R; 402f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 412f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu/** 424735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu * Slide distance toward/from a edge. 434735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu * This is a limited Slide implementation for KitKat without propagation support. 444735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu * @hide 452f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu */ 464735bfcd924fec2d694523f34fac5f8151257dc7Dake Guclass SlideKitkat extends Visibility { 474735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu private static final String TAG = "SlideKitkat"; 482f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 492f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu private static final TimeInterpolator sDecelerate = new DecelerateInterpolator(); 502f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu private static final TimeInterpolator sAccelerate = new AccelerateInterpolator(); 512f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 524735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu private int mSlideEdge; 534735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu private CalculateSlide mSlideCalculator; 542f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 552f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu private interface CalculateSlide { 562f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu /** Returns the translation value for view when it out of the scene */ 574735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu float getGone(View view); 582f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 592f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu /** Returns the translation value for view when it is in the scene */ 602f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu float getHere(View view); 612f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 622f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu /** Returns the property to animate translation */ 632f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu Property<View, Float> getProperty(); 642f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 652f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 662f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu private static abstract class CalculateSlideHorizontal implements CalculateSlide { 672f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu @Override 682f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu public float getHere(View view) { 692f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu return view.getTranslationX(); 702f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 712f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 722f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu @Override 732f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu public Property<View, Float> getProperty() { 742f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu return View.TRANSLATION_X; 752f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 762f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 772f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 782f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu private static abstract class CalculateSlideVertical implements CalculateSlide { 792f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu @Override 802f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu public float getHere(View view) { 812f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu return view.getTranslationY(); 822f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 832f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 842f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu @Override 852f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu public Property<View, Float> getProperty() { 862f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu return View.TRANSLATION_Y; 872f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 882f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 892f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 902f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu private static final CalculateSlide sCalculateLeft = new CalculateSlideHorizontal() { 912f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu @Override 924735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu public float getGone(View view) { 934735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu return view.getTranslationX() - view.getWidth(); 942f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 952f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu }; 962f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 972f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu private static final CalculateSlide sCalculateTop = new CalculateSlideVertical() { 982f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu @Override 994735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu public float getGone(View view) { 1004735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu return view.getTranslationY() - view.getHeight(); 1012f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 1022f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu }; 1032f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 1042f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu private static final CalculateSlide sCalculateRight = new CalculateSlideHorizontal() { 1052f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu @Override 1064735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu public float getGone(View view) { 1074735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu return view.getTranslationX() + view.getWidth(); 1082f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 1092f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu }; 1102f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 1112f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu private static final CalculateSlide sCalculateBottom = new CalculateSlideVertical() { 1122f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu @Override 1134735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu public float getGone(View view) { 1144735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu return view.getTranslationY() + view.getHeight(); 1154735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu } 1164735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu }; 1174735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu 1184735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu private static final CalculateSlide sCalculateStart = new CalculateSlideHorizontal() { 1194735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu @Override 1204735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu public float getGone(View view) { 1214735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu if (view.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) { 1224735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu return view.getTranslationX() + view.getWidth(); 1234735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu } else { 1244735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu return view.getTranslationX() - view.getWidth(); 1254735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu } 1262f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 1272f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu }; 1282f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 1294735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu private static final CalculateSlide sCalculateEnd = new CalculateSlideHorizontal() { 1304735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu @Override 1314735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu public float getGone(View view) { 1324735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu if (view.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) { 1334735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu return view.getTranslationX() - view.getWidth(); 1344735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu } else { 1354735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu return view.getTranslationX() + view.getWidth(); 1364735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu } 1374735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu } 1384735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu }; 1394735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu 1404735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu public SlideKitkat() { 1414735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu setSlideEdge(Gravity.BOTTOM); 1422f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 1432f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 1444735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu public SlideKitkat(Context context, AttributeSet attrs) { 1454735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.lbSlide); 1464735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu int edge = a.getInt(R.styleable.lbSlide_lb_slideEdge, Gravity.BOTTOM); 1474735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu setSlideEdge(edge); 1484735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu long duration = a.getInt(R.styleable.lbSlide_android_duration, -1); 1494735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu if (duration >= 0) { 1504735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu setDuration(duration); 1514735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu } 1524735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu long startDelay = a.getInt(R.styleable.lbSlide_android_startDelay, -1); 1534735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu if (startDelay > 0) { 1544735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu setStartDelay(startDelay); 1554735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu } 1564735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu final int resID = a.getResourceId(R.styleable.lbSlide_android_interpolator, 0); 1574735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu if (resID > 0) { 1584735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu setInterpolator(AnimationUtils.loadInterpolator(context, resID)); 1594735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu } 1604735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu a.recycle(); 1612f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 1622f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 1634735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu /** 1644735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu * Change the edge that Views appear and disappear from. 1654735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu * 1664735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu * @param slideEdge The edge of the scene to use for Views appearing and disappearing. One of 1674735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu * {@link android.view.Gravity#LEFT}, {@link android.view.Gravity#TOP}, 1684735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu * {@link android.view.Gravity#RIGHT}, {@link android.view.Gravity#BOTTOM}, 1694735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu * {@link android.view.Gravity#START}, {@link android.view.Gravity#END}. 1704735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu */ 1714735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu public void setSlideEdge(int slideEdge) { 1722f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu switch (slideEdge) { 1734735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu case Gravity.LEFT: 1744735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu mSlideCalculator = sCalculateLeft; 1754735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu break; 1764735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu case Gravity.TOP: 1774735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu mSlideCalculator = sCalculateTop; 1784735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu break; 1794735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu case Gravity.RIGHT: 1804735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu mSlideCalculator = sCalculateRight; 1814735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu break; 1824735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu case Gravity.BOTTOM: 1834735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu mSlideCalculator = sCalculateBottom; 1844735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu break; 1854735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu case Gravity.START: 1864735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu mSlideCalculator = sCalculateStart; 1874735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu break; 1884735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu case Gravity.END: 1894735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu mSlideCalculator = sCalculateEnd; 1904735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu break; 1912f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu default: 1922f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu throw new IllegalArgumentException("Invalid slide direction"); 1932f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 1944735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu mSlideEdge = slideEdge; 1954735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu } 1964735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu 1974735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu /** 1984735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu * Returns the edge that Views appear and disappear from. 1994735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu * @return the edge of the scene to use for Views appearing and disappearing. One of 2004735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu * {@link android.view.Gravity#LEFT}, {@link android.view.Gravity#TOP}, 2014735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu * {@link android.view.Gravity#RIGHT}, {@link android.view.Gravity#BOTTOM}, 2024735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu * {@link android.view.Gravity#START}, {@link android.view.Gravity#END}. 2034735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu */ 2044735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu public int getSlideEdge() { 2054735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu return mSlideEdge; 2062f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 2072f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 2082f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu private Animator createAnimation(final View view, Property<View, Float> property, 20933f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu float start, float end, float terminalValue, TimeInterpolator interpolator, 21033f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu int finalVisibility) { 21133f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu float[] startPosition = (float[]) view.getTag(R.id.lb_slide_transition_value); 21233f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu if (startPosition != null) { 21333f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu start = View.TRANSLATION_Y == property ? startPosition[1] : startPosition[0]; 21433f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu view.setTag(R.id.lb_slide_transition_value, null); 2152f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 2162f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu final ObjectAnimator anim = ObjectAnimator.ofFloat(view, property, start, end); 2172f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 21833f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu SlideAnimatorListener listener = new SlideAnimatorListener(view, property, terminalValue, end, 21933f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu finalVisibility); 2202f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu anim.addListener(listener); 2212f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu anim.addPauseListener(listener); 2222f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu anim.setInterpolator(interpolator); 2232f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu return anim; 2242f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 2252f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 2262f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu @Override 2272f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu public Animator onAppear(ViewGroup sceneRoot, 2282f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu TransitionValues startValues, int startVisibility, 2292f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu TransitionValues endValues, int endVisibility) { 2302f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu View view = (endValues != null) ? endValues.view : null; 2312f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu if (view == null) { 2322f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu return null; 2332f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 2344735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu float end = mSlideCalculator.getHere(view); 2354735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu float start = mSlideCalculator.getGone(view); 2364735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu return createAnimation(view, mSlideCalculator.getProperty(), start, end, end, sDecelerate, 23733f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu View.VISIBLE); 2382f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 2392f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 2402f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu @Override 2412f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu public Animator onDisappear(ViewGroup sceneRoot, 2422f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu TransitionValues startValues, int startVisibility, 2432f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu TransitionValues endValues, int endVisibility) { 2442f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu View view = (startValues != null) ? startValues.view : null; 2452f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu if (view == null) { 2462f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu return null; 2472f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 2484735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu float start = mSlideCalculator.getHere(view); 2494735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu float end = mSlideCalculator.getGone(view); 2502f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 2514735bfcd924fec2d694523f34fac5f8151257dc7Dake Gu return createAnimation(view, mSlideCalculator.getProperty(), start, end, start, 25233f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu sAccelerate, View.INVISIBLE); 2532f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 2542f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 2552f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu private static class SlideAnimatorListener extends AnimatorListenerAdapter { 2562f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu private boolean mCanceled = false; 25733f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu private float mPausedValue; 2582f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu private final View mView; 25933f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu private final float mEndValue; 26033f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu private final float mTerminalValue; 26133f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu private final int mFinalVisibility; 26233f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu private final Property<View, Float> mProp; 26333f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu 26433f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu public SlideAnimatorListener(View view, Property<View, Float> prop, 26533f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu float terminalValue, float endValue, int finalVisibility) { 26633f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu mProp = prop; 2672f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu mView = view; 26833f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu mTerminalValue = terminalValue; 26933f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu mEndValue = endValue; 27033f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu mFinalVisibility = finalVisibility; 27133f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu view.setVisibility(View.VISIBLE); 2722f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 2732f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 2742f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu @Override 2752f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu public void onAnimationCancel(Animator animator) { 27633f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu float[] transitionPosition = new float[2]; 27733f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu transitionPosition[0] = mView.getTranslationX(); 27833f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu transitionPosition[1] = mView.getTranslationY(); 27933f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu mView.setTag(R.id.lb_slide_transition_value, transitionPosition); 28033f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu mProp.set(mView, mTerminalValue); 2812f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu mCanceled = true; 2822f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 2832f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 2842f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu @Override 2852f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu public void onAnimationEnd(Animator animator) { 2862f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu if (!mCanceled) { 28733f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu mProp.set(mView, mTerminalValue); 2882f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 28933f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu mView.setVisibility(mFinalVisibility); 2902f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 2912f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 2922f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu @Override 2932f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu public void onAnimationPause(Animator animator) { 29433f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu mPausedValue = mProp.get(mView); 29533f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu mProp.set(mView, mEndValue); 29633f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu mView.setVisibility(mFinalVisibility); 2972f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 2982f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 2992f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu @Override 3002f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu public void onAnimationResume(Animator animator) { 30133f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu mProp.set(mView, mPausedValue); 30233f66eb67b6457ea75434dfd9f79703ad9e03560Dake Gu mView.setVisibility(View.VISIBLE); 3032f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 3042f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 3052f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu}