当调用invalidate(Rect)时,ImageView如何只重绘其内容的一部分?

7

我刚开始学习Android开发,正在阅读文档并尝试使用API。我很困惑ImageView在调用invalidate(Rect)后是如何只绘制其部分内容的。

我查看了ImageView.java文件,除了onDraw(Canvas)方法外没有找到其他绘图方法,但是onDraw(Canvas)方法只会裁剪Drawable对象,如果它超出了视图的可见边界。

我还阅读了View.invalidate(Rect)方法的实现,我认为这个函数的关键在于调用 mParent.invalidateChild(this, r); 然而,我认为父视图不知道如何在给定的Rect中绘制子视图,最终必须调用其子视图的某些方法来绘制出来。

有人研究过这部分代码吗?你能给我一些指导吗?

3个回答

3
据我所知,有两种优化正在进行。首先,如果子项是一个视图组,则仅重绘与失效区域相交的该组的子项。此外,画布被剪裁到该矩形的边界。这意味着需要通过总线传输到帧缓冲区的像素更少,并且可以跳过完全被剪裁的绘制操作。
这只是一个半猜测。我几个月前浏览了源代码,并且非常确定 ViewGroup 的事情。第二个可以通过在 onDraw 中覆盖剪辑并检查是否重新绘制所有内容来测试。

我是一个Android的新手,我在这里有一个问题https://dev59.com/4XvZa4cB1Zd3GeqP_B24如果可能的话,请提供答案。 - Kraken

1

-1 因为两个链接现在都失效了。包含一些它们的内容会更好。 - Mark Whitaker
1
+1 因为链接没有失效...我刚刚测试过了。然而,我同意在这种情况下添加内容是一件好事。 - Justin

0

我认为Android绘制视图的方式就像J2ME中的画布一样,所有的绘制代码并不是直接绘制到硬件(屏幕)上,而是绘制到缓冲区或可绘制对象中。当我们调用View.invalidate(Rect)时,系统会将缓冲区(或可绘制对象)中矩形范围内的图像复制到硬件(屏幕)上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接