Android过度绘制深度优化---View提前绘制

本文探讨了Android过度绘制的优化策略,重点介绍了View提前绘制的原理和实践。通过预先绘制View并减少不必要的绘制层次,可以有效解决过度绘制问题。文中详细解释了优化前后过度绘制的情况,并给出了具体的实现代码,包括自定义控件和关键方法的讲解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原理介绍:

上一篇文章对过度绘制和View优化做了大概的简介和介绍。我们知道,引起过度绘制的根本原因是 背景(背景包裹背景图片、颜色、形状、边框等等)。

那么通常你在网络查找过度绘制优化策略,不外乎减少View的层叠、多余的控件、一个多余的背景设置等等。可如果你真的去审查代码,会发现你并没有多少可优化的地方。这个时候,你就需要 Android过度绘制深度优化—View提前绘制

先说原理:不做处理的View绘制过程像一把刷子一层层去绘制View,第一层刷一个形状,第二层刷背景图片/颜色,第三层刷文字等等,那么,如果我们将View提前画好,然后交给系统去绘制。这样不管你的View之前刷过多少次,系统只需要绘制一次。这样,过度绘制就可以轻松解决啦!

先上效果图:
优化前 & 优化后:
图片名称 图片名称

Tips:
1.首先控件的实现方式略有不同(带图标的输入框),但对我们这片文章讲的东西并没有冲突。
2.优化后的图片,为了突出所以添加了带图案的背景图片

颜色说明:
优化前:

  • Window(无色) 绘制一次
  • 背景(蓝色) 绘制2次
  • Logo,输入框带小图标的背景,按钮,忘记密码(绿色)绘制三次
  • 输入框本身,按钮文字 (红色) 绘制三次
  • 输入框内部文字 (深红色) 绘制四次

优化后:

  • 背景(无色) 绘制一次 : 背景设置到主题后,将取代原本Window默认背景。
  • Logo,按钮,带形状和颜色的输入框背景,忘记密码文字 (蓝色) 绘制两次: 这里我们对输入框和按钮进行了提前绘制,并去掉了按钮默认背景,所以按钮加其内部文字只绘制一次。带形状、颜色的输入框只绘制一次。
  • 文本框上面的图片和文字(绿色)绘制三次

注意要点

View提前绘制可以从根本上去解决问题过度绘制问题,但并不是没有代价的,但你在做优化前,需要注意一下几个点:

  • View的提前绘制只能应用到那些静态的View
  • View的提前绘制并不能加过View的绘制速度,甚至会有小幅度的绘制时间增加。(提前在内存中进行View的绘制是有代价的)
  • 界面是有一定刷新频率的,每一次刷新都会调用View的onDraw方法,而View提前绘制就是在onDraw中进行。所以你需要考虑效率和性能问题。如:避免在onDraw创建对象,避免在onDraw进行绘制,应在构造函数中画好,交给onDraw。
  • 对于登录界面,提前绘制的工作量和其收益比起来是得不偿失的,所以你需要进行权衡,哪里需要提前绘制。通常我是这样做的:大量被重用的控件,非常复杂的布局,布局之上有动画效果(过度绘制对动画的影响是极大的)

也许在你看到View的提前绘制是有代价的,就决定不在进行优化,这是错误的。除非极其复杂的View,负责提前绘制带来收益是绝对大于那多出来的一丢丢绘制时间的。

另外即使类似于登录界面这样的简单布局没有必要进行过度绘制优化,但依然有大量的优秀公司进行了优化。我认为有两个点:
1.登录界面是应用打开的第一个界面,也是整个应用最简单的界面之一,用它来试手肯定是第一选择。
2.这是一个态度和逼格的问题。打开过度绘制调试后,别人家的应用蓝蓝的,怎么你的应用就是红彤彤一片?

正文

啊,好吧,废话说的有点多了,下面我们上代码。

Github链接:https://github.com/lizhaoxuan/SoftWidgetDemo.git

首先看目录结构:

图片名称

有四个核心类:
DrawingCanvas.java 我们提前绘制就在这个类上画,然后交给onDraw,一气呵成。
PaintBox.java 里面包含了几个绘制方法,比如画背景颜色和形状

SRoundRect_Button.java SRoundRect_LinearLayout.java 是两个自定义控件,从名字上可以看出来,两个圆角矩形的按钮和线性布局

然后看布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:padding="10dp">

    <ImageView
        android:id="@+id/logoView"
        android:layout_width="1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值