【发布时间】:2015-04-30 14:21:34
【问题描述】:
我编写了一个仅显示一个自定义视图的 Activity。
视图很简单,绘制随机颜色并使更小的区域失效,绘制随机颜色并使更小的区域失效,以此类推……
预期结果应该类似于this。它通过使用软件渲染效果很好,getClipBounds() 返回我刚刚传递给无效的区域。但是当启用硬件加速时,整个视图总是用新颜色重绘,getClipBounds()返回整个视图的区域。
我知道有一些帖子,例如 this 和 this。答案说 getClipBounds() 通过硬件加速返回整个视图的区域,但只有与脏区域相交的区域才会被重绘。
有什么不对还是我的误会?
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
// random color
int color = Color.rgb((int) (Math.random() * 255),
(int) (Math.random() * 255), (int) (Math.random() * 255));
canvas.drawColor(color);
canvas.getClipBounds(rect);
// smaller dirty region
invalidate(0, 0, rect.width() - 1, rect.height() - 1);
}
【问题讨论】:
-
这似乎是 Android 中的一个错误/缺陷。整个视图总是被重绘,性能也会因此受到影响。在这些情况下,我所做的是创建一个视图网格,这些视图进入父视图,并且父视图足够聪明,可以正确地使网格中的子视图无效,并将正确的位图发送给它们进行绘制。跨度>
标签: android invalidation hardware-acceleration dirtyrectangle