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動畫,可以參考: