package com.mehtank.androminion.ui; import java.util.ArrayList; import android.view.View; import android.view.ViewGroup; import android.view.animation.AccelerateInterpolator; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.view.animation.AnimationSet; import android.view.animation.DecelerateInterpolator; import android.view.animation.LinearInterpolator; import android.view.animation.TranslateAnimation; import android.widget.FrameLayout; import com.mehtank.androminion.R; public class CardAnimator { @SuppressWarnings("unused") private static final String TAG = "CardAnimator"; public static enum ShowCardType {OBTAINED, TRASHED, REVEALED}; private ViewGroup rootView; private int left; private int top; private int height; public void init(View anchor) { rootView = (ViewGroup) anchor.getRootView(); int[] location = new int[2]; anchor.getLocationOnScreen(location); left = location[0]; top = location[1]; height = anchor.getHeight(); /* ViewParent vp = anchor.getParent(); while (vp != rootView) { left += ((View)vp).getLeft(); top += ((View)vp).getTop(); vp = vp.getParent(); } */ } public void showCard(CardView c, ShowCardType type) { AlphaAnimation alpha = null; TranslateAnimation trans; AnimationSet anims = new AnimationSet(true); anims.setInterpolator(new LinearInterpolator()); int cardWidth = (int) c.getResources().getDimension(R.dimen.cardWidth); switch (type) { case OBTAINED: alpha = new AlphaAnimation(0, 1); trans = new TranslateAnimation( Animation.ABSOLUTE, left, Animation.ABSOLUTE, left, Animation.ABSOLUTE, top - height, Animation.ABSOLUTE, top ); anims.setInterpolator(new DecelerateInterpolator()); break; case TRASHED: alpha = new AlphaAnimation(1, 0); trans = new TranslateAnimation( Animation.ABSOLUTE, left, Animation.ABSOLUTE, left, Animation.ABSOLUTE, top, Animation.ABSOLUTE, top + height); anims.setInterpolator(new AccelerateInterpolator()); break; default: // REVEALED // alpha = new AlphaAnimation(1, 0.5f); trans = new TranslateAnimation( Animation.ABSOLUTE, left, Animation.ABSOLUTE, left + cardWidth, Animation.ABSOLUTE, top, Animation.ABSOLUTE, top); } if (alpha != null) alpha.setDuration(1000); trans.setDuration(1000); if (alpha != null) anims.addAnimation(alpha); anims.addAnimation(trans); trans = new TranslateAnimation(0, 0, 0, 0); trans.setDuration(2000); // anims.addAnimation(trans); anims.setAnimationListener(new CVAnimListener(c)); FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(cardWidth, ViewGroup.LayoutParams.WRAP_CONTENT); c.setLayoutParams(lp); rootView.addView(c); c.startAnimation(anims); cvs.add(c); runningAnims.add(anims); } private static ArrayList<AnimationSet> runningAnims = new ArrayList<AnimationSet>(); private static ArrayList<CardView> cvs = new ArrayList<CardView>(); private class CVAnimListener implements AnimationListener { CardView v; public CVAnimListener(CardView v) { this.v = v; } @Override public void onAnimationEnd(Animation animation) { v.setVisibility(View.GONE); runningAnims.remove(animation); if (runningAnims.size() == 0) { for (CardView c : cvs) rootView.removeView(c); cvs.clear(); } } @Override public void onAnimationRepeat(Animation animation) {} @Override public void onAnimationStart(Animation animation) {} } }