一旦我的应用程序同时运行~4个动画,动画开始滞后一点.有什么办法可以解决/优化吗?我正在使用ObjectAnimator和ValueAnimator.
最佳答案
因此,如果视图不必在动画期间重绘,则可以在动画持续时间内启用硬件图层.例如:
final View myView = // your view
Animator animator = ObjectAnimator.ofFloat(myView,View.ALPHA,0f,1f);
animator.setDuration(1000);
animator.addAnimatorListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
myView.setLayerType(View.LAYER_TYPE_HARDWARE,null);
}
@Override
public void onAnimationCancel(Animator animator) {
myView.setLayerType(View.LAYER_TYPE_NONE,null);
}
@Override
public void onAnimationEnd(Animator animator) {
// See https://stackoverflow.com/a/19615205/321697
myView.post(new Runnable() {
@Override
public void run() {
myView.setLayerType(View.LAYER_TYPE_NONE,null);
}
}
}
}
animator.start();
我建议将该侦听器实现分解为一个单独的类,但一般的想法是,您希望在动画开始后立即将视图放入硬件支持的层(动画属性,如平移,旋转,缩放和alpha在由硬件层支持时非常便宜,然后在动画完成后清除图层.
在onAnimationEnd回调中,如果在onAnimationEnd回调中将图层类型设置为none,则会注意到另一个答案的链接,其中存在4.0.x的错误.如果您只支持4.1及更高版本,则不需要runnable间接.
编辑:如果您正在设置颜色过渡动画,您可能不希望执行上述操作,因为更改视图的颜色将需要重绘它,从而导致它在每个帧上重建硬件层.