技术咨询、项目合作、广告投放、简历咨询、技术文档下载
点击这里 联系博主
# 避免过度绘制
过度绘制(OverDraw
)是指在屏幕上在某一个像素,子安同一帧的时间内被多次的绘制,常见的是重复被组件或者布局添加背景颜色,等等。
主要原因:
- XML布局文件,控件有重叠且都有设置背景。
- View的自绘中,View.onDraw里面同一个区域被多次绘制了。
# 一、过度绘制的检测工具
打开手机设置中开发者人员选项,选择打开“显示GPU过度重绘”,对没有默认开启硬件加速的界面需要同时打开“强制进行GPU渲染”。
- 无色:没有过度重绘, 每个像素只绘制一次
- 蓝色:每个像素多绘制了一次(可接受)
- 绿色:每个像素多绘制两次(可接受)
- 淡红:每个像素多绘制三次,一般来说这个区域不超过屏幕的1/4是可以接受的。
- 深红:每个像素被绘制四次或者更多。不可接受。
目标:减少红色,显示更多蓝色区域。
# 二、布局上的优化
- 移除XML中非必须的背景,或者根据条件设置
- 移除window的默认背景(在setContentView前面加上this.getWindow().setBackgroundDrawable(null));
- 按需显示占位背景图片。
# 三、自定义View的优化
在View的自绘中,会存在View的过度重绘,比如多个组件重叠在一起,如果我们只绘制出它显示的部分就解决了过度重绘问题,假设多个组件都按照原本大小绘制的话,将会到底过度重绘。
- 在自定义View中可以使用
canvas.clipRect()
来帮助系统识别哪些可见的区域,这个方法指定一个矩形区域,只有在这个区域内才会被绘制,其他区域将不会被绘制。 - 使用
canvas.quickreject()
来判断是否没和某个矩形相交,从而跳过哪些非矩形区域内的绘制操作。
在RecyclerView
或者ListView
或者其他容器控件中,ItemView
如果比较复杂,建议实现成一个自绘View
,这样会让滑动更加顺畅。
以一个四个卡片叠加咋自定义View为例子
- 本文链接: https://mrgaogang.github.io/android/performance/%E9%81%BF%E5%85%8D%E8%BF%87%E5%BA%A6%E7%BB%98%E5%88%B6.html
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明出处!