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

一旦我的应用程序同时运行~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间接.

编辑:如果您正在设置颜色过渡动画,您可能不希望执行上述操作,因为更改视图的颜色将需要重绘它,从而导致它在每个帧上重建硬件层.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...