【问题标题】:Android partial invalidation draws the entire view while hardware acceleratedAndroid 部分失效会在硬件加速时绘制整个视图
【发布时间】:2015-04-30 14:21:34
【问题描述】:

我编写了一个仅显示一个自定义视图的 Activity。

视图很简单,绘制随机颜色并使更小的区域失效,绘制随机颜色并使更小的区域失效,以此类推……

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

我知道有一些帖子,例如 thisthis。答案说 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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    相关资源
    最近更新 更多