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