1

我写了一个只显示一个自定义视图的活动。

视图很简单,绘制随机颜色并使较小的区域无效,并绘制随机颜色并使更小的区域无效,等等......

预期的结果应该是这样。它通过使用软件渲染效果很好,getClipBounds() 返回我刚刚传递给无效的区域。但是当启用硬件加速时,整个视图总是用新的颜色重绘,并且 getClipBounds() 返回整个视图的区域。

我知道有一些这样的帖子这个。答案说 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);
}
4

1 回答 1

2

不幸的是,这是 Android 中硬件加速的限制,至少从 Android 5 开始。无效的矩形被忽略,整个视图总是重绘,需要你绘制整个区域。如果您尝试仅绘制视图的一部分,则之前在视图中绘制的任何其他内容都将消失。

我读过一些帖子,声称Android不会重新渲染整个视图,而只是重新渲染改变的部分,但这似乎是错误的,因为当我尝试只渲染我传递给无效的矩形区域时,视图的其余部分消失。如果 Android 确实只重新渲染了更改的区域,那么我希望视图中自定义绘图的其余部分保持可见。

iOS 的 drawRect 方法和 setNeedsDisplayInRect 具有更好的性能。我原以为 Android 会以同样的方式工作,但可惜事实并非如此。

于 2015-10-02T16:18:37.917 回答