在同时运行多个动画时减少延迟的任何提示?

时间:2015-07-07 01:32:36

标签: android android-animation objectanimator

一旦我的应用程序同时运行~4 +动画,动画开始滞后一点。有什么办法可以解决/优化吗?我正在使用ObjectAnimator和ValueAnimator。

2 个答案:

答案 0 :(得分:5)

因此,如果视图不必在动画期间重绘,则可以在动画持续时间内启用硬件图层。例如:

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();

我建议将该侦听器实现分解为一个单独的类,但一般的想法是,您希望在动画启动后立即将视图放入硬件支持的层(动画属性,如平移,旋转,当由硬件层支持时,缩放和alpha非常便宜,然后在动画完成后清除图层。

onAnimationEnd回调中,如果您在onAnimationEnd回调中将图层类型设置为无,那么您会注意到另一个答案的链接,其中有4.0.x的错误。如果您只支持4.1及更高版本,则无需运行间接。

编辑:如果您要设置颜色过渡动画,则可能不想想要执行上述操作,因为更改视图的颜色需要重新绘制,导致它在每个帧上重建硬件层。

答案 1 :(得分:0)

如果您还没有使用ViewPropertyAnimator,最好这样做。我顺利地移动并翻转(改变了图片)52 imageViews(一副扑克牌)。 Here's有关如何使用ViewPropertyAnimator的示例。