package com.cheikh.lazywaimai.util; import android.app.Activity; import android.graphics.Bitmap; import android.view.View; import android.view.ViewGroup; import android.view.animation.AccelerateInterpolator; import android.view.animation.Animation; import android.view.animation.AnimationSet; import android.view.animation.ScaleAnimation; import android.view.animation.TranslateAnimation; import android.widget.ImageView; import android.widget.LinearLayout; public class ShoppingCartAnimation { private Activity mActivity; private int[] mAnimationEndLocation; public ShoppingCartAnimation(Activity activity) { mActivity = activity; int height = DensityUtil.getScreenH(activity); mAnimationEndLocation = new int[] {50, height}; } public void setAnimationEndLocation(int[] animationEndLocation) { mAnimationEndLocation = animationEndLocation; } /** * 启动加入到购物车的动画 */ public void startAnimation(View startView, final OnAnimationListener listener) { // 创建一个覆盖在界面上的动画图层并生成对话对象 final View animView = createAnimView(startView); final ViewGroup animLayout = createAnimLayer(); animLayout.addView(animView); // 设置动画对象的初始位置 int[] animStartLoc = getAnimStartLoc(startView); setAnimStartLoc(animStartLoc, animView); // 根据起始位置和终点位置创建动画的轨迹 int[] offset = getAnimOffset(animStartLoc, mAnimationEndLocation); final Animation animation = buildAnimation(offset); // 设置动画的执行监听器 animation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationStart(Animation animation) { if (listener != null) { listener.onAnimationStart(); } } @Override public void onAnimationEnd(Animation animation) { // 将动画图层移除 final ViewGroup parent = (ViewGroup) animLayout.getParent(); parent.post(new Runnable() { @Override public void run() { parent.removeView(animLayout); if (listener != null) { listener.onAnimationEnd(); } } }); } }); animView.startAnimation(animation); } /** * 创建动画层 * * @return */ private ViewGroup createAnimLayer() { final ViewGroup decorView = (ViewGroup) mActivity.getWindow().getDecorView(); LinearLayout ll = new LinearLayout(mActivity); ll.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); ll.setBackgroundResource(android.R.color.transparent); decorView.addView(ll); return ll; } /** * 创建动画对象 * * @param v * @return */ private View createAnimView(View v) { v.buildDrawingCache(); Bitmap animBitmap = v.getDrawingCache(); ImageView ivAnim = new ImageView(mActivity); ivAnim.setImageBitmap(animBitmap); return ivAnim; } /** * 获得动画开始位置,即价格视图所在位置 * * @param v * @return */ private int[] getAnimStartLoc(View v) { int[] location = new int[2]; v.getLocationOnScreen(location); return location; } /** * 设置动画起始位置 * * @param startLoc * @param animView */ private void setAnimStartLoc(int[] startLoc, View animView) { LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); lp.leftMargin = startLoc[0]; lp.topMargin = startLoc[1]; animView.setLayoutParams(lp); } /** * 获得动画x,y坐标的偏移量 * * @param startLoc * @param endLoc * @return */ private int[] getAnimOffset(int[] startLoc, int[] endLoc) { int[] offset = new int[2]; offset[0] = endLoc[0] - startLoc[0]; offset[1] = endLoc[1] - startLoc[1]; return offset; } /** * 根据偏移量创建动画 * * @param offset * @return */ private Animation buildAnimation(int[] offset) { AnimationSet as = new AnimationSet(false); TranslateAnimation translateX = new TranslateAnimation(0, offset[0], 0, 0); TranslateAnimation translateY = new TranslateAnimation(0, 0, 0, offset[1]); translateY.setInterpolator(new AccelerateInterpolator()); ScaleAnimation scaleAnimation = new ScaleAnimation(1, 0, 1, 0); scaleAnimation.setInterpolator(new AccelerateInterpolator()); as.addAnimation(scaleAnimation); as.addAnimation(translateX); as.addAnimation(translateY); as.setDuration(500); return as; } public interface OnAnimationListener { void onAnimationStart(); void onAnimationEnd(); } }