针对HW和SW中invalidate的不同效果的demo实验:
相关资料:
demo的GitHub地址 运行名称为app的model
完整文档
代码
自定义了CountDrawView,每次onDraw都累加 计数器,并将调用次数 drawText
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (countDraw > (Long.MAX_VALUE - 1)) {
Log.e(Tag, "count max,reset");
countDraw = 0;
}
countDraw++;
canvas.translate(50, 50);
canvas.drawText("Times: " + countDraw, 0, 0, mTextPaint);
}
Manifest声明
<activity android:name=".drawmodel.HardWareDrawlActivity"/>
<activity android:name=".drawmodel.SoftWareDrawlActivity"
android:hardwareAccelerated="false"
/>
Software draw model
- 点击Button-1,Button-1和CountDrawView重叠的区域times数值改变(我开启了开发者模式----显示布局边界,粉色那个是button-1的margin区域),但是未重叠的区域仍旧是1。
- 可以看出Button-1的点击,导致的redraw是对View重叠的脏区(dirty region)进行。所以CountDrawView上面是1 下面是最新的绘制次数。
- 锁屏后再解锁
可以看到CountDrawView被整体刷新了,Times是57
Hardware accelerate draw model
点击Button-1、Button-2,CountDrawView Times一直是1,也就是在硬件加速下 没有脏区的概念(各个View事独立的状态),是不会invalidate 重叠的View