11c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho/* 21c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * Copyright (C) 2016 The Android Open Source Project 31c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * 41c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * Licensed under the Apache License, Version 2.0 (the "License"); 51c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * you may not use this file except in compliance with the License. 61c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * You may obtain a copy of the License at 71c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * 81c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * http://www.apache.org/licenses/LICENSE-2.0 91c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * 101c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * Unless required by applicable law or agreed to in writing, software 111c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * distributed under the License is distributed on an "AS IS" BASIS, 121c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * See the License for the specific language governing permissions and 141c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * limitations under the License. 151c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho */ 161c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 171c4fce94062e162e579d20134f0bac767bdf0964Donghyun Chopackage android.support.v7.app; 181c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 191c4fce94062e162e579d20134f0bac767bdf0964Donghyun Choimport android.content.Context; 201c4fce94062e162e579d20134f0bac767bdf0964Donghyun Choimport android.graphics.Canvas; 211c4fce94062e162e579d20134f0bac767bdf0964Donghyun Choimport android.graphics.Rect; 221c4fce94062e162e579d20134f0bac767bdf0964Donghyun Choimport android.graphics.drawable.BitmapDrawable; 231c4fce94062e162e579d20134f0bac767bdf0964Donghyun Choimport android.util.AttributeSet; 241c4fce94062e162e579d20134f0bac767bdf0964Donghyun Choimport android.view.animation.Interpolator; 251c4fce94062e162e579d20134f0bac767bdf0964Donghyun Choimport android.widget.ListView; 261c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 271c4fce94062e162e579d20134f0bac767bdf0964Donghyun Choimport java.util.ArrayList; 281c4fce94062e162e579d20134f0bac767bdf0964Donghyun Choimport java.util.Iterator; 291c4fce94062e162e579d20134f0bac767bdf0964Donghyun Choimport java.util.List; 301c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 311c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho/** 321c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * A ListView which has an additional overlay layer. {@link BitmapDrawable} 331c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * can be added to the layer and can be animated. 341c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho */ 351c4fce94062e162e579d20134f0bac767bdf0964Donghyun Chofinal class OverlayListView extends ListView { 361c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho private final List<OverlayObject> mOverlayObjects = new ArrayList<>(); 371c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 381c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho public OverlayListView(Context context) { 391c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho super(context); 401c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 411c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 421c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho public OverlayListView(Context context, AttributeSet attrs) { 431c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho super(context, attrs); 441c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 451c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 461c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho public OverlayListView(Context context, AttributeSet attrs, int defStyleAttr) { 471c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho super(context, attrs, defStyleAttr); 481c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 491c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 501c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho /** 511c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * Adds an object to the overlay layer. 521c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * 531c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * @param object An object to be added. 541c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho */ 551c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho public void addOverlayObject(OverlayObject object) { 561c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mOverlayObjects.add(object); 571c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 581c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 591c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho /** 601c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * Starts all animations of objects in the overlay layer. 611c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho */ 621c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho public void startAnimationAll() { 631c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho for (OverlayObject object : mOverlayObjects) { 641c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho if (!object.isAnimationStarted()) { 651c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho object.startAnimation(getDrawingTime()); 661c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 671c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 681c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 691c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 701c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho /** 711c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * Stops all animations of objects in the overlay layer. 721c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho */ 731c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho public void stopAnimationAll() { 741c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho for (OverlayObject object : mOverlayObjects) { 751c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho object.stopAnimation(); 761c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 771c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 781c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 791c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho @Override 801c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho public void onDraw(Canvas canvas) { 811c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho super.onDraw(canvas); 821c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho if (mOverlayObjects.size() > 0) { 831c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho Iterator<OverlayObject> it = mOverlayObjects.iterator(); 841c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho while (it.hasNext()) { 851c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho OverlayObject object = it.next(); 861c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho BitmapDrawable bitmap = object.getBitmapDrawable(); 871c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho if (bitmap != null) { 881c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho bitmap.draw(canvas); 891c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 901c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho if (!object.update(getDrawingTime())) { 911c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho it.remove(); 921c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 931c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 941c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 951c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 961c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 971c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho /** 981c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * A class that represents an object to be shown in the overlay layer. 991c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho */ 1001c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho public static class OverlayObject { 1011c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho private BitmapDrawable mBitmap; 1021c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho private float mCurrentAlpha = 1.0f; 1031c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho private Rect mCurrentBounds; 1041c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho private Interpolator mInterpolator; 1051c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho private long mDuration; 1061c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho private Rect mStartRect; 1071c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho private int mDeltaY; 1081c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho private float mStartAlpha = 1.0f; 1091c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho private float mEndAlpha = 1.0f; 1101c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho private long mStartTime; 1111c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho private boolean mIsAnimationStarted; 1121c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho private boolean mIsAnimationEnded; 1131c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho private OnAnimationEndListener mListener; 1141c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 1151c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho public OverlayObject(BitmapDrawable bitmap, Rect startRect) { 1161c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mBitmap = bitmap; 1171c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mStartRect = startRect; 1181c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mCurrentBounds = new Rect(startRect); 1191c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho if (mBitmap != null && mCurrentBounds != null) { 1201c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mBitmap.setAlpha((int) (mCurrentAlpha * 255)); 1211c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mBitmap.setBounds(mCurrentBounds); 1221c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 1231c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 1241c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 1251c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho /** 1261c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * Returns the bitmap that this object represents. 1271c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * 1281c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * @return BitmapDrawable that this object has. 1291c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho */ 1301c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho public BitmapDrawable getBitmapDrawable() { 1311c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho return mBitmap; 1321c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 1331c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 1341c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho /** 1351c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * Returns the started status of the animation. 1361c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * 1371c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * @return True if the animation has started, false otherwise. 1381c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho */ 1391c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho public boolean isAnimationStarted() { 1401c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho return mIsAnimationStarted; 1411c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 1421c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 1431c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho /** 1441c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * Sets animation for varying alpha. 1451c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * 1461c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * @param startAlpha Starting alpha value for the animation, where 1.0 means 1471c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * fully opaque and 0.0 means fully transparent. 1481c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * @param endAlpha Ending alpha value for the animation. 1491c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * @return This OverlayObject to allow for chaining of calls. 1501c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho */ 1511c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho public OverlayObject setAlphaAnimation(float startAlpha, float endAlpha) { 1521c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mStartAlpha = startAlpha; 1531c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mEndAlpha = endAlpha; 1541c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho return this; 1551c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 1561c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 1571c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho /** 1581c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * Sets animation for moving objects vertically. 1591c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * 1601c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * @param deltaY Distance to move in pixels. 1611c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * @return This OverlayObject to allow for chaining of calls. 1621c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho */ 1631c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho public OverlayObject setTranslateYAnimation(int deltaY) { 1641c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mDeltaY = deltaY; 1651c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho return this; 1661c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 1671c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 1681c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho /** 1691c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * Sets how long the animation will last. 1701c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * 1711c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * @param duration Duration in milliseconds 1721c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * @return This OverlayObject to allow for chaining of calls. 1731c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho */ 1741c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho public OverlayObject setDuration(long duration) { 1751c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mDuration = duration; 1761c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho return this; 1771c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 1781c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 1791c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho /** 1801c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * Sets the acceleration curve for this animation. 1811c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * 1821c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * @param interpolator The interpolator which defines the acceleration curve 1831c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * @return This OverlayObject to allow for chaining of calls. 1841c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho */ 1851c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho public OverlayObject setInterpolator(Interpolator interpolator) { 1861c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mInterpolator = interpolator; 1871c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho return this; 1881c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 1891c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 1901c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho /** 1911c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * Binds an animation end listener to the animation. 1921c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * 1931c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * @param listener the animation end listener to be notified. 1941c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * @return This OverlayObject to allow for chaining of calls. 1951c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho */ 1961c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho public OverlayObject setAnimationEndListener(OnAnimationEndListener listener) { 1971c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mListener = listener; 1981c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho return this; 1991c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 2001c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 2011c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho /** 2021c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * Starts the animation and sets the start time. 2031c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * 2041c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * @param startTime Start time to be set in Millis 2051c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho */ 2061c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho public void startAnimation(long startTime) { 2071c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mStartTime = startTime; 2081c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mIsAnimationStarted = true; 2091c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 2101c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 2111c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho /** 2121c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * Stops the animation. 2131c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho */ 2141c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho public void stopAnimation() { 2151c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mIsAnimationStarted = true; 2161c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mIsAnimationEnded = true; 2171c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho if (mListener != null) { 2181c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mListener.onAnimationEnd(); 2191c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 2201c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 2211c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 2221c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho /** 2231c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * Calculates and updates current bounds and alpha value. 2241c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * 2251c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * @param currentTime Current time.in millis 2261c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho */ 2271c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho public boolean update(long currentTime) { 2281c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho if (mIsAnimationEnded) { 2291c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho return false; 2301c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 2311c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho float normalizedTime = (currentTime - mStartTime) / (float) mDuration; 2321c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho normalizedTime = Math.max(0.0f, Math.min(1.0f, normalizedTime)); 2331c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho if (!mIsAnimationStarted) { 2341c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho normalizedTime = 0.0f; 2351c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 2361c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho float interpolatedTime = (mInterpolator == null) ? normalizedTime 2371c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho : mInterpolator.getInterpolation(normalizedTime); 2381c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho int deltaY = (int) (mDeltaY * interpolatedTime); 2391c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mCurrentBounds.top = mStartRect.top + deltaY; 2401c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mCurrentBounds.bottom = mStartRect.bottom + deltaY; 2411c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mCurrentAlpha = mStartAlpha + (mEndAlpha - mStartAlpha) * interpolatedTime; 2421c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho if (mBitmap != null && mCurrentBounds != null) { 2431c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mBitmap.setAlpha((int) (mCurrentAlpha * 255)); 2441c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mBitmap.setBounds(mCurrentBounds); 2451c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 2461c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho if (mIsAnimationStarted && normalizedTime >= 1.0f) { 2471c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mIsAnimationEnded = true; 2481c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho if (mListener != null) { 2491c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho mListener.onAnimationEnd(); 2501c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 2511c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 2521c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho return !mIsAnimationEnded; 2531c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 2541c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho 2551c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho /** 2561c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * An animation listener that receives notifications when the animation ends. 2571c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho */ 2581c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho public interface OnAnimationEndListener { 2591c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho /** 2601c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho * Notifies the end of the animation. 2611c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho */ 2621c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho public void onAnimationEnd(); 2631c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 2641c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho } 2651c4fce94062e162e579d20134f0bac767bdf0964Donghyun Cho} 266