View做在做动画的时候,它并没有真正的移动它的位置。而是根据动画时间的插值,计算出一个Matrix,然后不停的invalidate,在onDraw中的Canvas上使用这个计算出来的Matrix去draw这个View的内容。
换句话说,View在做动画的时候,它的位置根本没有变化,只是画它的时候进行了Matrix处理,使得它看起来变化了。那么,动画中的View点击事件的判断区域,应该是它“看起来”的那片区域,而不是它layout的那片区域。
我相信很多人还是不明白。所以特地找到了一个大牛人写的另外一个博文《Android 动画框架详解》,供大家搞明白Android中的动画原理。明白了Android补间动画的原理之后,然后再读下去。
http://www.ibm.com/developerworks/cn/opensource/os-cn-android-anmt1/index.html
由于android的绘图机制,就算正常情况下移动了view,它所对应的点击事件仍然显示在原来位置上,个人觉得解决方案有两种:
1.正常移动view后,重新绘制view
/**
* float fromXDelta:这个参数表示动画开始的点离当前View X坐标上的差值;
float toXDelta, 这个参数表示动画结束的点离当前View X坐标上的差值;
float fromYDelta, 这个参数表示动画开始的点离当前View Y坐标上的差值;
float toYDelta)这个参数表示动画开始的点离当前View Y坐标上的差值;
如果view在A(x,y)点 那么动画就是从B点(x+fromXDelta, y+fromYDelta)点移动到C 点(x+toXDelta,y+toYDelta)点.
* @param view
* @param fromXDelta
* @param toXDelta
* @param fromYDelta
* @param toYDelta
*/
public static void regist_bt_slideview(final View view, final float fromXDelta, final float toXDelta
, final float fromYDelta, final float toYDelta) {
//平移动画
TranslateAnimation animation = new TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta);
//Interpolator插值器:OvershootInterpolator向前甩一定值后再回到原来位置,
// 不懂可以阅读:http://blog.csdn.net/harvic880925/article/details/40049763
animation.setInterpolator(new OvershootInterpolator());
//设置动画时长:1s
animation.setDuration(1000);
//监听动画
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
int left = view.getLeft();
int top = view.getTop()+(int)(toYDelta-fromYDelta);
int width = view.getWidth();
int height = view.getHeight();
view.clearAnimation();
view.setX(left);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.WRAP_CONTENT); //The WRAP_CONTENT parameters can be replaced by an absolute width and height or the FILL_PARENT option)
params.topMargin = top; //Your Y coordinate
params.setMargins(width/2,top,width/2,0);
view.setLayoutParams(params);
//view.layout(left, top, left+width, top+height);
}
});
view.startAnimation(animation);
}
2.使用ValueAnimator动画,可以参考: