【问题标题】:How does ImageView just redraw part of its content when invalidate(Rect) is called?调用 invalidate(Rect) 时,ImageView 如何仅重绘其部分内容?
【发布时间】:2011-02-04 15:41:37
【问题描述】:

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

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

有人调查过这部分代码吗?请给我好吗 一些指南?

【问题讨论】:

    标签: android view invalidation


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我猜该代码在 View 类中。

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

      【讨论】:

      • -1 因为两个链接现在都死了。在这里包含他们的一些内容会更好。
      • +1 因为链接没有死...我只是测试了它们。但是,我同意在这种情况下添加内容是一件好事。
      猜你喜欢
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多