public class AnimUtils {
/**
* 运动的控件
*/
public static Bitmap getAddDrawBitMap(Context context) {
ImageView text = new ImageView(context);
// 运动的控件,样式可以自定义
text.setBackgroundResource(R.drawable.ic_add_food);
return convertViewToBitmap(text);
}
/**
* 创建动画层
*/
private static ViewGroup createAnimLayout(Context context) {
ViewGroup rootView = (ViewGroup) ((Activity) context).getWindow().getDecorView();
LinearLayout animLayout = new LinearLayout(context);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
animLayout.setLayoutParams(lp);
animLayout.setId(Integer.MAX_VALUE);
animLayout.setBackgroundResource(android.R.color.transparent);
rootView.addView(animLayout);
return animLayout;
}
private static View addViewToAnimLayout(final ViewGroup vg, final View view, int[] location) {
int x = location[0];
int y = location[1];
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
lp.leftMargin = x;
lp.topMargin = y;
view.setLayoutParams(lp);
return view;
}
/**
* 开始执行动画
* @param context context
* @param v 运动的图片
* @param startView 动画开始位置的控件
* @param view2 动画结束位置的控件
*/
public static void setAnim(Context context, final View v, View startView, ImageView view2) {
ViewGroup anim_mask_layout = createAnimLayout(context);
// 把动画小球添加到动画层
anim_mask_layout.addView(v);
// 一个整型数组,用来存储按钮的在屏幕的X、Y坐标
int[] start_location = new int[2];
// 这是获取购买按钮的在屏幕的X、Y坐标(这也是动画开始的坐标)
startView.getLocationInWindow(start_location);
View view = addViewToAnimLayout(anim_mask_layout, v, start_location);
// 这是用来存储动画结束位置的X、Y坐标
int[] end_location = new int[2];
// rl_gouwuche是小球运动的终点 一般是购物车图标
view2.getLocationInWindow(end_location);
// 计算位移
// int endX = 0 - start_location[0] + 40;// 动画位移的X坐标
int endX = end_location[0] - start_location[0] + 40;// 动画位移的X坐标
int endY = end_location[1] - start_location[1];// 动画位移的y坐标
TranslateAnimation translateAnimationX = new TranslateAnimation(0, endX, 0, 0);
translateAnimationX.setInterpolator(new LinearInterpolator());
translateAnimationX.setRepeatCount(0);// 动画重复执行的次数
translateAnimationX.setFillAfter(true);
TranslateAnimation translateAnimationY = new TranslateAnimation(0, 0, 0, endY);
translateAnimationY.setInterpolator(new AccelerateInterpolator());
translateAnimationY.setRepeatCount(0);// 动画重复执行的次数
translateAnimationX.setFillAfter(true);
AnimationSet set = new AnimationSet(false);
set.setFillAfter(false);
set.addAnimation(translateAnimationY);
set.addAnimation(translateAnimationX);
set.setDuration(400);// 动画的执行时间
view.startAnimation(set);
// 动画监听事件
set.setAnimationListener(new Animation.AnimationListener() {
// 动画的开始
@Override
public void onAnimationStart(Animation animation) {
v.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
// 动画的结束
@Override
public void onAnimationEnd(Animation animation) {
v.setVisibility(View.GONE);
}
});
}
/**
* 将定义的view装换成 bitmap格式
*
*/
private static Bitmap convertViewToBitmap(View view) {
view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
return bitmap;
}
/**
* 开始执行动画
* 首页添加传入QMUITabSegment类型的方法(自己项目中用到的)
*/
public static void setAnim(Context context, final View v, View startView, QMUITabSegment tab) {
ViewGroup anim_mask_layout = null;
anim_mask_layout = createAnimLayout(context);
// 把动画小球添加到动画层
anim_mask_layout.addView(v);
// 一个整型数组,用来存储按钮的在屏幕的X、Y坐标
int[] start_location = new int[2];
// 这是获取购买按钮的在屏幕的X、Y坐标(这也是动画开始的坐标)
startView.getLocationInWindow(start_location);
View view = addViewToAnimLayout(anim_mask_layout, v, start_location);
// 这是用来存储动画结束位置的X、Y坐标
int[] end_location = new int[2];
// rl_gouwuche是小球运动的终点 一般是购物车图标
tab.getLocationInWindow(end_location);
System.out.println("start_location = " + Arrays.toString(start_location));
System.out.println("end_location = " + Arrays.toString(end_location));
// 计算位移
int endX = tab.getWidth()/2-start_location[0];// 动画位移的X坐标
int endY = end_location[1] - start_location[1];// 动画位移的y坐标
TranslateAnimation translateAnimationX = new TranslateAnimation(0, endX, 0, 0);
translateAnimationX.setInterpolator(new LinearInterpolator());
translateAnimationX.setRepeatCount(0);// 动画重复执行的次数
translateAnimationX.setFillAfter(true);
TranslateAnimation translateAnimationY = new TranslateAnimation(0, 0, 0, endY);
translateAnimationY.setInterpolator(new AccelerateInterpolator());
translateAnimationY.setRepeatCount(0);// 动画重复执行的次数
translateAnimationX.setFillAfter(true);
AnimationSet set = new AnimationSet(false);
set.setFillAfter(false);
set.addAnimation(translateAnimationY);
set.addAnimation(translateAnimationX);
set.setDuration(400);// 动画的执行时间
view.startAnimation(set);
// 动画监听事件
set.setAnimationListener(new Animation.AnimationListener() {
// 动画的开始
@Override
public void onAnimationStart(Animation animation) {
v.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
// 动画的结束
@Override
public void onAnimationEnd(Animation animation) {
v.setVisibility(View.GONE);
}
});
}
}
使用的时候:
ImageView imageView = new ImageView(this);
// 设置buyImg的图片
imageView.setImageBitmap(AnimUtils.getAddDrawBitMap(RecipeDetailActicity.this));
// 开始执行动画
AnimUtils.setAnim(RecipeDetailActicity.this, imageView, addIv, selectIv);//替换成自己相应的控件