当我们应用android平移动画时,一般会给动画一个监听,当动画结束时,会将view的位置重新绘制到我们想要的位置,因为平移动画并没与真的改变控件的实际位置.
代码如下:
Animation animation = new TranslateAnimation(0, 0, 0, -mTop);
animation.setDuration(ANI_TIME);
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
//动画结束后更新view到终点位置
mTopView.layout(left, top, right, bottom);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
mTopView.startAnimation(animation);
但是实际使用的时候,当更新实际位置的时候,view会有跳动,在stackoverflow中有人贴出了解决方案
代码如下:
Animation animation = new TranslateAnimation(0, 0, 0, -mTop);
animation.setDuration(ANI_TIME);
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
//防止跳动
TranslateAnimation animation = new TranslateAnimation(0.0f, 0.0f, 0.0f, 0.0f);
animation.setDuration(1);
mTopView.startAnimation(animation);
//动画结束后更新view到终点位置
mTopView.layout(left, top, right, bottom);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
mTopView.startAnimation(animation);
在实际写的时候,偶然发现另一种方式也是有效的,不过这种有点违反直觉,就是倒着写动画,先把view更新到终点位置,代码如下:
//由于更新到终点位置,坐标参考以终点为参考系
Animation animation = new TranslateAnimation(0, 0, mTop, 0);
animation.setDuration(ANI_TIME);
mTopView.startAnimation(animation);
//更新到终点位置
mTopView.layout(left, top, right, bottom);
但是,为何出现view跳动的原因一直没找到分析的文章,若有人知道望请告知.