10496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague/*
20496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * Copyright (C) 2014 The Android Open Source Project
30496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague *
40496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * Licensed under the Apache License, Version 2.0 (the "License");
50496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * you may not use this file except in compliance with the License.
60496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * You may obtain a copy of the License at
70496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague *
80496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague *      http://www.apache.org/licenses/LICENSE-2.0
90496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague *
100496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * Unless required by applicable law or agreed to in writing, software
110496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * distributed under the License is distributed on an "AS IS" BASIS,
120496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * See the License for the specific language governing permissions and
140496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * limitations under the License.
150496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague */
160496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
170496fcaa51f88f6c753975473b971941e4090cfaSpike Spraguepackage com.android.camera.ui;
180496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
190496fcaa51f88f6c753975473b971941e4090cfaSpike Spragueimport android.animation.Animator;
200496fcaa51f88f6c753975473b971941e4090cfaSpike Spragueimport android.animation.Animator.AnimatorListener;
210496fcaa51f88f6c753975473b971941e4090cfaSpike Spragueimport android.animation.ValueAnimator;
220496fcaa51f88f6c753975473b971941e4090cfaSpike Spragueimport android.content.res.Resources;
230496fcaa51f88f6c753975473b971941e4090cfaSpike Spragueimport android.graphics.Canvas;
240496fcaa51f88f6c753975473b971941e4090cfaSpike Spragueimport android.graphics.ColorFilter;
250496fcaa51f88f6c753975473b971941e4090cfaSpike Spragueimport android.graphics.Paint;
260496fcaa51f88f6c753975473b971941e4090cfaSpike Spragueimport android.graphics.PixelFormat;
270496fcaa51f88f6c753975473b971941e4090cfaSpike Spragueimport android.graphics.Point;
280496fcaa51f88f6c753975473b971941e4090cfaSpike Spragueimport android.graphics.drawable.Drawable;
290496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
300496fcaa51f88f6c753975473b971941e4090cfaSpike Spragueimport com.android.camera.util.Gusterpolator;
310496fcaa51f88f6c753975473b971941e4090cfaSpike Spragueimport com.android.camera2.R;
320496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
330496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague/**
340496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * This class implements a circular drawable that starts with a zero radius
350496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * and can be triggered to animate expand to a given radius.
360496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * <p>
37955ae1f8afc9c4fb0905e0baece959efac9326f6Spike Sprague * There are two colors associated with this drawable:
380496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * <p>
390496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * A background color, which is loaded from a resource
400496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * R.color.mode_icon_hover_highlight.
410496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * <p>
420496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * And, a main color, which is attached to the main circle that is expanded last
430496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * and is drawn on top of the other colors.
440496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * <p>
450496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * The driving purpose for this class is to implement a Material-like look and
460496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * feel for mode switcher touch events.
470496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague */
480496fcaa51f88f6c753975473b971941e4090cfaSpike Spraguepublic class TouchCircleDrawable extends Drawable {
49955ae1f8afc9c4fb0905e0baece959efac9326f6Spike Sprague    private static final int CIRCLE_ANIM_DURATION_MS = 250;
500496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
510496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    private Paint mColorPaint = new Paint();
520496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    private Paint mBackgroundPaint = new Paint();
530496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    private int mColor;
540496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    private int mColorAlpha = 0xff;
550496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    private int mColorRadius;
560496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    private int mBackgroundRadius;
570496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    private Drawable mIconDrawable;
580496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    private int mIconDrawableSize;
590496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    private boolean mDrawBackground;
600496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
610496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    private Animator.AnimatorListener mAnimatorListener;
620496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    private ValueAnimator.AnimatorUpdateListener mUpdateListener;
630496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
640496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    private static final int INVALID = -1;
650496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    private int mW = INVALID;
660496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    private int mH = INVALID;
670496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    private Point mCenter;
680496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
690496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    /**
700496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * Constructor
710496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     *
720496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * @param resources Resources, needed to poke around for the background
730496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * color value.
740496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * @param color The main this circle drawable expands to.
750496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * @param baseColor The color of the initial expanded circle
760496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * (draws behind the main color).
770496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     */
780496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    public TouchCircleDrawable(Resources resources, int color, int baseColor) {
790496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        super();
800496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
810496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        mColorPaint.setAntiAlias(true);
820496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        mBackgroundPaint.setAntiAlias(true);
830496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        mBackgroundPaint.setColor(resources.getColor(R.color.mode_icon_hover_highlight));
840496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
850496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        setColor(color);
860496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    }
870496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
880496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    /**
890496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * Constructor
900496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     *
910496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * @param resources Resources, needed to poke around for the background color value.
920496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     */
930496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    public TouchCircleDrawable(Resources resources) {
940496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        this(resources, 0xffffff, 0xffffff);
950496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    }
960496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
970496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    /**
980496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * Set the size of this drawable.
990496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     *
1000496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * @param w Width to set.
1010496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * @param h Height to set.
1020496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     */
1030496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    public void setSize(int w, int h) {
1040496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        mW = w;
1050496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        mH = h;
1060496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    }
1070496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
1080496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    /**
1090496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * Set the center of the circle for this drawable.
1100496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     *
1110496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * @param p The center point.
1120496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     */
1130496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    public void setCenter(Point p) {
1140496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        mCenter = p;
1150496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        updateIconBounds();
1160496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    }
1170496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
1180496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    /**
1190496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * @return The center of this drawable.
1200496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     */
1210496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    public Point getCenter() {
1220496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        return mCenter;
1230496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    }
1240496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
1250496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    @Override
1260496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    public void draw(Canvas canvas) {
1270496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        int w = mW;
1280496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        int h = mH;
1290496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
1300496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        if (w == INVALID || h == INVALID || mCenter == null) {
1310496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague            return;
1320496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        }
1330496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
1340496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        if (mDrawBackground) {
1350496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague            canvas.drawCircle(mCenter.x, mCenter.y, mBackgroundRadius, mBackgroundPaint);
1360496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        }
1370496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        canvas.drawCircle(mCenter.x, mCenter.y, mColorRadius, mColorPaint);
1380496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        if (mIconDrawable != null) {
1390496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague            mIconDrawable.draw(canvas);
1400496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        }
1410496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    }
1420496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
1430496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    @Override
1440496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    public void setAlpha(int alpha) {
1450496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        mColorAlpha = alpha;
1460496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    }
1470496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
1480496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    @Override
1490496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    public void setColorFilter(ColorFilter cf) {
1500496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        mColorPaint.setColorFilter(cf);
1510496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    }
1520496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
1530496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    @Override
1540496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    public int getOpacity() {
1550496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        return PixelFormat.TRANSLUCENT;
1560496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    }
1570496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
1580496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    /**
1590496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * Set the main color.
1600496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     *
1610496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * @param color The main color.
1620496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     */
1630496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    public void setColor(int color) {
1640496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        mColor = color;
1650496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        mColorPaint.setColor(mColor);
1660496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        mColorPaint.setAlpha(mColorAlpha);
1670496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    }
1680496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
1690496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    public void setIconDrawable(Drawable d, int size) {
1700496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        mIconDrawable = d;
1710496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        mIconDrawableSize = size;
1720496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        updateIconBounds();
1730496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    }
1740496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
1750496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    private void updateIconBounds() {
1760496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        if (mCenter != null) {
1770496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague            mIconDrawable.setBounds(
1780496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                mCenter.x - mIconDrawableSize/2, mCenter.y - mIconDrawableSize/2,
1790496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                mCenter.x + mIconDrawableSize/2, mCenter.y + mIconDrawableSize/2);
1800496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        }
1810496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    }
1820496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
1830496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    /**
1840496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * Start the expand animation.
1850496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     */
1860496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    public void animate() {
1870496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        mBackgroundRadius = Math.min(mW/2, mH/2);
1880496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
1890496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        final ValueAnimator colorAnimator =
1900496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                ValueAnimator.ofInt(0, Math.min(mW/2, mH/2));
1910496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        colorAnimator.setDuration(CIRCLE_ANIM_DURATION_MS);
1920496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        colorAnimator.setInterpolator(Gusterpolator.INSTANCE);
1930496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        colorAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
1940496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague            @Override
1950496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague            public void onAnimationUpdate(ValueAnimator animation) {
1960496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                mColorRadius = (Integer) animation.getAnimatedValue();
1970496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                invalidateSelf();
1980496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                if (mUpdateListener != null) {
1990496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                    mUpdateListener.onAnimationUpdate(animation);
2000496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                }
2010496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague            }
2020496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        });
2030496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
204955ae1f8afc9c4fb0905e0baece959efac9326f6Spike Sprague        colorAnimator.addListener(new AnimatorListener() {
2050496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague            @Override
2060496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague            public void onAnimationStart(Animator animation) {
2070496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                mDrawBackground = true;
2080496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
2090496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                if (mAnimatorListener != null) {
2100496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                    mAnimatorListener.onAnimationStart(animation);
2110496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                }
2120496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague            }
2130496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
2140496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague            @Override
2150496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague            public void onAnimationEnd(Animator animation) {
2160496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                mDrawBackground = false;
2170496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
2180496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                if (mAnimatorListener != null) {
2190496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                    mAnimatorListener.onAnimationEnd(animation);
2200496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                }
2210496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague            }
2220496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
2230496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague            @Override
2240496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague            public void onAnimationCancel(Animator animation) {
2250496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                mDrawBackground = false;
2260496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
2270496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                if (mAnimatorListener != null) {
2280496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                    mAnimatorListener.onAnimationCancel(animation);
2290496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                }
2300496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague            }
2310496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
2320496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague            @Override
2330496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague            public void onAnimationRepeat(Animator animation) {
2340496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                if (mAnimatorListener != null) {
2350496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                    mAnimatorListener.onAnimationRepeat(animation);
2360496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague                }
2370496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague            }
2380496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        });
239955ae1f8afc9c4fb0905e0baece959efac9326f6Spike Sprague
240955ae1f8afc9c4fb0905e0baece959efac9326f6Spike Sprague        colorAnimator.start();
2410496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    }
2420496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
2430496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    /**
2440496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     *  Reset this drawable to its initial, preanimated state.
2450496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     */
2460496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    public void reset() {
247955ae1f8afc9c4fb0905e0baece959efac9326f6Spike Sprague        mColorRadius = 0;
2480496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    }
2490496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
2500496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    /**
2510496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * Set an {@link android.animation.Animator.AnimatorListener} to be
2520496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * attached to the animation.
2530496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     *
2540496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * @param listener The listener.
2550496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     */
2560496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    public void setAnimatorListener(Animator.AnimatorListener listener) {
2570496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        mAnimatorListener = listener;
2580496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    }
2590496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
2600496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    /**
2610496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * Set an {@link android.animation.ValueAnimator} to be
2620496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * attached to the animation.
2630496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     *
2640496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * @param listener The listener.
2650496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     */
2660496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    public void setUpdateListener(ValueAnimator.AnimatorUpdateListener listener) {
2670496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        mUpdateListener = listener;
2680496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    }
2690496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague}
270