【问题标题】:Can I redraw a View without forcing a redraw of the underlying View?我可以在不强制重绘基础视图的情况下重绘视图吗?
【发布时间】:2015-10-26 10:53:52
【问题描述】:

我在顶部绘制了一个大的自定义视图(地图)和一个较小的视图(高度计)。

有什么方法可以在不强制完全重绘底部视图的情况下更新顶部视图?

【问题讨论】:

    标签: android view


    【解决方案1】:

    不,这是不可能的(在正常意义上)。当您在彼此之上有多个视图时,在一个视图上调用 invalidate() 将重绘所有这些视图。当在视图上调用 invalidate() 时,它会重绘位于 dirty region 中的任何内容。这由ViewGroup 中的dispathDraw() 方法处理。 dispatchDraw() 反过来调用 drawChild(),这就是为什么当我们在一个视图上调用 invalidate() 时,其他视图也会被绘制。

    话虽如此,您可以在自己的自定义 ViewGroup 中覆盖 dispatchDraw() 方法并处理事情的行为方式。

    【讨论】:

    • 谢谢。我正在尝试使下视图成为RelativeLayout 的子类,以便直接由它处理覆盖视图。覆盖 dispatchDraw() 绝对是可行的。
    • 叹息。刚刚查看了dispatchDraw() 的源代码——它比我愿意覆盖的要复杂得多。我希望有一种简单的方式来表达“使这个观点无效,但不要让其他观点无效。”
    • 更新:如果视图具有不透明背景,可能的。见下文。
    【解决方案2】:

    另外:我刚刚发现,如果你给 View 一个不透明的背景,使其无效不会使底层 View 无效。这不是一个完美的解决方案,但它是一个非常好的解决方案。

    现在我需要看看是否可以制作一个非矩形的视图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 2011-10-19
      • 1970-01-01
      • 2013-05-11
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多