利用 view animation 实现组件的动画效果时,需要注意以下几个问题:
- view animation 的动画结束后,真实的组件还是在原来起点的位置(组件就收鼠标事件的区域没用更改),我们所看到的动画效果只是对可视部分的不断重新绘制
- setFillAfter方法的作用是设置一个动画效果执行完毕后,View对象是否保留在终止的位置
- 若我们需要将真实组件最终移动到动画结束的位置,则需要在动画结束的回调函数内,调用组件的 clearAnimation接口,来清除动画过程中对某些属性的修改
- 在调用 clearAnimation接口后,利用layout接口可改变组件的真实位置
- 若调用layout之前不调用 clearAnimation接口: setFillAfter为flase时,会出现跳闪的问题, setFillAfter为true时,会出现组件偏离正确位置的问题
- view animation 的动画结束后,真实的组件还是在原来起点的位置(组件就收鼠标事件的区域没用更改),我们所看到的动画效果只是对可视部分的不断重新绘制
- setFillAfter方法的作用是设置一个动画效果执行完毕后,View对象是否保留在终止的位置
- 若我们需要将真实组件最终移动到动画结束的位置,则需要在动画结束的回调函数内,调用组件的 clearAnimation接口,来清除动画过程中对某些属性的修改
- 在调用 clearAnimation接口后,利用layout接口可改变组件的真实位置
- 若调用layout之前不调用 clearAnimation接口: setFillAfter为flase时,会出现跳闪的问题, setFillAfter为true时,会出现组件偏离正确位置的问题
具体可参考以下代码:
private void createRelayoutAnimator(final View v, final int left, final int top,
final int width, final int height){
int xDelta = left - v.getLeft();
int yDelta = top- v.getTop();
TranslateAnimation tran = new TranslateAnimation(0,xDelta,0,yDelta);
tran.setDuration(200);
tran.setFillAfter(true);
tran.setAnimationListener(new AnimationListener(){
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
v.clearAnimation();
v.layout(left, top, left + width, top + height);
}
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
});
v.startAnimation(tran);
}