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

时间:2010-04-06 02:16:38

标签: android view invalidation

我是Android开发的新手,只是阅读文档并尝试了 蜜蜂。我不知道ImageView如何设法绘制的一部分 无效(Rect)调用后的内容。

我查过了ImageView.java,发现没有其他绘图方法除外 onDraw(Canvas),但是onDraw(Canvas)只在它是的时候才切断drawable beyound视图的可见边界。 我也读过View.invalidate(Rect)的实现,我觉得 这个函数的关键是调用     mParent.invalidateChild(this,r); 但是,我认为父视图不知道如何绘制子项 给定的Rect,它最终必须调用它的一些方法 画出来。

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

3 个答案:

答案 0 :(得分:3)

据我所知,有两种优化方式。例如,如果子视图是一个视图组,则只重绘与该无效区域相交的该组的子视图。此外,画布被剪裁到此rect的边界。这意味着必须将较少的像素通过总线混洗到帧缓冲区,并且可以跳过完全剪切的绘制操作。

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

答案 1 :(得分:1)

我猜这段代码在View类。

google小组中的Romain Guy有两个有趣的答案。

答案 2 :(得分:0)

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