7

我是 Android 开发的新手,只是阅读文档并尝试 API。我很困惑 ImageView 如何在 invalidate(Rect) 调用之后设法仅绘制其内容的一部分。

我检查了 ImageView.java,发现除了 onDraw(Canvas) 之外没有其他绘图方法,但 onDraw(Canvas) 仅在它超出视图的可见边界时才剪切可绘制对象。我还阅读了 View.invalidate(Rect) 的实现,我认为这个函数的关键是调用 mParent.invalidateChild(this, r); 但是,我认为父视图不知道如何在给定的 Rect 中绘制孩子,它最终必须调用它的一些方法来绘制孩子。

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

4

3 回答 3

3

据我所知,有两个优化之一。一方面,如果子视图组是视图组,则仅重绘与无效区域相交的该组的子节点。此外,画布被剪裁到该矩形的边界。这意味着必须通过总线将更少的像素改组到帧缓冲区,并且可以跳过完全裁剪的绘制操作。

这是一个半有根据的猜测。几个月前我浏览了源代码,并且相当确定 ViewGroup 的事情。第二个可以通过覆盖 onDraw 中的剪辑并检查它是否重绘所有内容来测试。

于 2011-02-06T21:24:42.610 回答
1

我猜这个代码在View课堂上。

谷歌小组中有两个来自 Romain Guy 的有趣答案。

于 2010-12-19T14:37:15.733 回答
0

我认为 android 绘制视图就像 j2me 中的画布一样,所有绘制代码​​都不是直接绘制到硬件(屏幕),它只是绘制到缓冲区或可绘制或其他东西。当我们调用 View.invalidate(Rect) 时,系统会将缓冲区(或可绘制)矩形中的图像复制到硬件(屏幕)。

于 2011-01-24T07:05:20.717 回答