一旦我的应用达到同时运行 ~4+ 个动画,动画就会开始有点滞后。有什么方法可以修复/优化它吗?我正在使用 ObjectAnimator 和 ValueAnimator。
最佳答案
因此,如果 View 不需要在动画期间重新绘制自己,您可以在动画期间启用硬件层。例如:
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 http://stackoverflow.com/a/19615205/321697
myView.post(new Runnable() {
@Override
public void run() {
myView.setLayerType(View.LAYER_TYPE_NONE, null);
}
}
}
}
animator.start();
我建议将该监听器实现分解为一个单独的类,但一般的想法是您希望在动画开始后立即将 View 放入硬件支持层(动画属性,例如平移、旋转、缩放, 和 alpha 在有硬件层支持时非常便宜)然后在动画完成后清除该层。
在 onAnimationEnd
回调中,如果您在 onAnimationEnd 回调中将层类型设置为 none,您会注意到指向另一个答案的链接,其中存在 4.0.x 的错误。如果您只支持 4.1 及更高版本,则不需要可运行的间接寻址。
编辑:如果您正在为颜色过渡设置动画,您可能不想执行上述操作,因为更改 View 的颜色将需要重绘它,从而导致重建每个帧上的硬件层。
关于android - 在同时运行多个动画时减少延迟的任何技巧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31258321/