android - 在同时运行多个动画时减少延迟的任何技巧?

标签 android android-animation objectanimator

一旦我的应用达到同时运行 ~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/

相关文章:

java - Android 编辑文本和对话框

android - 在 gradle init 脚本中使用的 jar 的 Gradle 打印路径

android - 使用 RecyclerView、android jetpack 导航和折叠工具栏实现正确滚动

android - 使用/strings.xml覆盖res/values/strings.xml文件从服务器android下载到sd卡

java - 带有一些 ImageView 的动画包

android - viewpager 的自定义动画

Android共享元素过渡

android - PropertyValuesHolder : Couldn't find setter/getter for property <property-name> with value type float

Android 幻灯片元素删除

Android objectAnimator 动画真的很慢