技术咨询、项目合作、广告投放、简历咨询、技术文档下载 点击这里 联系博主

# 避免过度绘制

过度绘制(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为例子

【未经作者允许禁止转载】 Last Updated: 9/23/2024, 11:39:31 AM