直接上代码
ImageView ball = new ImageView(mContext);// bball 是将会动画的图片 ball.setImageResource(R.mipmap.icone_hongbao);// 设置红包的图片 setAnim(ball, iv_redpkg, iv_hongbao);// 开始执行动画
private int[] startLocation;
private int[] endLocation;
/**
*
* @param v 动画的控件
* @param start 起始位置
* @param tvTarget 结束为止
*/
private void setAnim(final View v, View start, View tvTarget) {
Log.d("Logger", "setAnim: ");
ViewGroup anim_mask_layout = createAnimLayout();
anim_mask_layout.addView(v);//把动画小球添加到动画层
if (startLocation == null) {
startLocation = new int[2];// 一个整型数组,用来存储按钮的在屏幕的X、Y坐标
endLocation = new int[2];// 存储动画结束位置的X、Y坐标
}
start.getLocationInWindow(startLocation);// 这是获取购买按钮的在屏幕的X、Y坐标(这也是动画开始的坐标)
Log.d("KsVideoFragment", "startLocation222: " + startLocation[0] + ",y:" + startLocation[1]);
final View view = addViewToAnimLayout(anim_mask_layout, v, startLocation);
tvTarget.getLocationInWindow(endLocation);// tvTarget是那个抛物线最后掉落的控件
Log.d("KsVideoFragment", "endLocation: " + endLocation[0] + ",y:" + endLocation[1]);
// 计算位移
// int endX = 0 - startLocation[0] + 40;// 动画位移的X坐标
int endX = endLocation[0] - startLocation[0];// 动画位移的X坐标
int endY = endLocation[1] - startLocation[1];// 动画位移的y坐标
//平移动画 绘制X轴 0到结束的x轴
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);// 动画重复执行的次数
translateAnimationY.setFillAfter(true);
final AnimationSet set = new AnimationSet(true);
set.setFillAfter(false);
set.addAnimation(translateAnimationY);
set.addAnimation(translateAnimationX);
set.setDuration(800);// 动画的执行时间
view.startAnimation(set);
// 动画监听事件
set.setAnimationListener(new Animation.AnimationListener() {
// 动画的开始
@Override
public void onAnimationStart(Animation animation) {
v.setVisibility(View.VISIBLE);
Log.e("Logger", "asdasdasdasd");
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
// 动画的结束
@Override
public void onAnimationEnd(Animation animation) {
Log.d("Logger", "onAnimationEnd: ");
v.setVisibility(View.GONE);
set.cancel();
animation.cancel();
}
});
}
private View addViewToAnimLayout(final ViewGroup parent, 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
* @return void
* @throws
* @Description: 创建动画层
*/
private ViewGroup createAnimLayout() {
ViewGroup rootView = (ViewGroup) getWindow().getDecorView();
LinearLayout animLayout = new LinearLayout(mContext);
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;
}
本文介绍了一种使用TranslateAnimation实现从一个视图到另一个视图的红包动画效果的方法。通过计算两个视图之间的相对位置,设置了X轴和Y轴的平移动画,并通过AnimationSet组合动画效果。
3863

被折叠的 条评论
为什么被折叠?



