Android 动画
由于产品需求,需要呈现出一个listView中item的翻转动画。于是便开始接触实现动画效果。
先来说说想要实现的效果:
1.在item中,点击按钮进行动画翻转。
2.翻转过程:指定view沿X轴进行向上翻转90°消失,指定view继续向上翻转90°显示。(归纳为:一个view翻转180°后显示另外一个view)
实现方案:使用属性动画。
public static void FlipAnimatorXViewShow(final View oldView, final View newView, final long time) {
ObjectAnimator animator1 = ObjectAnimator.ofFloat(oldView, "rotationX", 0, 90);
final ObjectAnimator animator2 = ObjectAnimator.ofFloat(newView, "rotationX", -90, 0);
animator1.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
oldView.setVisibility(View.GONE);
animator2.setDuration(time).start();
newView.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
animator1.setDuration(time).start();
}
本以为自己写的没有问题(其实确实没问题),但是由于是用在listview中,每当数据一刷新,需要显示新的数据,并且需要还原到oldView的内容。于是,我便只在数据刷新重新绘制界面时,让oldView.setVisibility(View.VISIBLE)。却在demo中的显示效果并不理想,oldView中并不是显示之前的内容。
根本原因:原因在于oldView向上翻转动画90°结束后,将oldView的RotationX属性设置为了90,此时oldView的视图仅仅只是条线段。所以,根本不会显示之前的内容数据。
解决方案:只需要在动画结束时,将oldView的RotationX属性设置回0就可以了。
oldView.setRotationX(0);//这行代码要求在api level在11以上
ViewCompat.setRotationX(oldView, 0);//因此想要兼容11一下的版本,使用v4包中的ViewCompat