/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android.ui.view; import android.animation.Animator; import android.animation.Animator.AnimatorListener; import android.content.Context; import android.graphics.Canvas; import android.graphics.Rect; import android.util.AttributeSet; import android.view.View; import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; /** * * @author sihai * */ public class PlusOneAnimatorView extends View implements AnimatorListener { private static final Interpolator sAccelerateInterpolator = new AccelerateInterpolator(1.2F); private static final Interpolator sDecelerateInterpolator = new DecelerateInterpolator(1.2F); private int mAnimStage; private ClickableButton mCurrentButton; private ClickableButton mNextButton; private int mOriginalTranslateY; private PlusOneAnimListener mPlusOneAnimListener; public PlusOneAnimatorView(Context context) { this(context, null); } public PlusOneAnimatorView(Context context, AttributeSet attributeset) { this(context, attributeset, 0); } public PlusOneAnimatorView(Context context, AttributeSet attributeset, int i) { super(context, attributeset, i); } public void onAnimationCancel(Animator animator) { if(mAnimStage >= 2) { mCurrentButton = null; mNextButton = null; mPlusOneAnimListener.onPlusOneAnimFinished(); } } public void onAnimationEnd(Animator animator) { if(0 == mAnimStage) { mCurrentButton = mNextButton; mNextButton = null; animate().setDuration(75L).scaleX(2.0F).setInterpolator(sDecelerateInterpolator).setListener(this); invalidate(); mAnimStage = 1 + mAnimStage; } else if (1 == mAnimStage) { animate().setDuration(270L).translationY(mOriginalTranslateY).scaleX(1.0F).scaleY(1.0F).setInterpolator(sDecelerateInterpolator).setListener(this); mAnimStage = 1 + mAnimStage; } else if(2 == mAnimStage) { mCurrentButton = null; mPlusOneAnimListener.onPlusOneAnimFinished(); invalidate(); } } public void onAnimationRepeat(Animator animator) { } public void onAnimationStart(Animator animator) { } protected void onDraw(Canvas canvas) { super.onDraw(canvas); if(mCurrentButton != null) mCurrentButton.draw(canvas); } protected void onMeasure(int i, int j) { if(mCurrentButton != null) { Rect rect = mCurrentButton.getRect(); setMeasuredDimension(rect.width(), rect.height()); } else { setMeasuredDimension(0, 0); } } public final void startPlusOneAnim(PlusOneAnimListener plusoneanimlistener, ClickableButton clickablebutton, ClickableButton clickablebutton1) { mAnimStage = 0; mPlusOneAnimListener = plusoneanimlistener; mCurrentButton = clickablebutton; mNextButton = clickablebutton1; Rect rect = clickablebutton.getRect(); setX(rect.left); setY(rect.top); rect.offsetTo(0, 0); clickablebutton1.getRect().offsetTo(0, 0); if(android.os.Build.VERSION.SDK_INT >= 12) { mOriginalTranslateY = (int)getTranslationY(); int i = 2 * mCurrentButton.getRect().height(); animate().setDuration(270L).translationY(mOriginalTranslateY - i).scaleX(2.0F).scaleY(2.0F).setInterpolator(sAccelerateInterpolator).setListener(this); } requestLayout(); } public static interface PlusOneAnimListener { public abstract void onPlusOneAnimFinished(); } }