我写了一个只显示一个自定义视图的活动。
视图很简单,绘制一个随机颜色并使较小的区域无效,并绘制一个随机颜色,并使一个更小的区域无效,等等......
预期结果应该与this类似。它通过使用软件渲染很好地工作,并且getClipBounds()返回我刚刚传递给invalidate的区域。但是当启用硬件加速时,整个视图总是以新颜色重绘,而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);
}
答案 0 :(得分:2)
不幸的是,这是Android硬件加速的限制,至少从Android 5开始。忽略invalidate rect并且整个视图总是重绘,要求你绘制整个区域。如果您尝试仅绘制视图的一部分,则之前在视图中绘制的任何其他内容都将消失。
我已经阅读过帖子声称Android不会重新渲染整个视图而只重新渲染部分,但这似乎是错误的,因为当我尝试只渲染我通过的矩形区域时为了无效,视图的重置消失。如果Android只重新渲染了更改的区域,那么我希望视图中的其余自定义绘图保持可见。
使用drawRect方法和setNeedsDisplayInRect,iOS的性能要好得多。我原以为Android会以同样的方式工作,但不会这样。