Android UI布局,优化过度绘制

2021-03-29  本文已影响0人  大川的川

优化前:

如何发现和监控XML的过度渲染和绘制?

设置—>开发人员选项—>硬件—>调试GPU过度绘制,然后选择 显示过度绘制区域 即可以看到一个不同颜色块的手机界面,各个颜色代表着不同的绘制情况:
本着最简洁的优化目标,理想化都应该是白色的,有些过度绘制我们无法避免,

白色:无过度绘制
蓝色:1次过度绘制
绿色:2次过度绘制
粉色和红色:你们懂的,去优化XML吧

如何避免过度绘制?

1、去除style.xml中的<item name="android:windowBackground">@color/*****</item>解决方法:

<item name="android:windowBackground">@null</item>getWindow().setBackgroundDrawable(null);

2、去除控件中不必要的背景填充,背景色填充是非常耗资源
3、减少透明度的使用,每个透明度都会进行两次以上的渲染
4、使用ConstraintLayout减少布局层级,ConstraintLayout比RelativeLayout性能更好,更简单
5、使用merge标签减少布局层级,
6、使用AsyncLayoutInflater异步加载,把耗时的布局渲染操作放在子线程中,等inflate操作完成后再回调到主线程(此方法只解决卡顿,而没有从根源的优化过度绘制)
new AsyncLayoutInflater(this).inflate(R.layout.activity_main, null, new AsyncLayoutInflater.OnInflateFinishedListener() {
            @Override
            public void onInflateFinished(@NonNull View view, int resid, @Nullable ViewGroup parent) {
                //view:加载得到 view
                setContentView(R.layout.activity_main);
                //一系列的 findViewById(...),adapter...
            }
        });
7、使用ViewStub标签延迟加载,个人感觉非必要

经过自己的项目实践,窄而深的嵌套布局,在项目中很少有,但是控件背景色确实是影响过度绘制的主要原因,筛查一下页面中的背景色,会有很好的效果!重复使用背景色填充的主要原因是我们所习惯的“复制粘贴”,因为项目中有很多相同的布局,从而忽略了其独有的背景色填充

优化后:

上一篇 下一篇

猜你喜欢

热点阅读