当我使其中一个视图无效时,为什么我的布局会完全重绘?

Sim*_*mon 4 android android-layout

我有一个复杂的框架布局包含几个自定义视图.主视图是图表.

覆盖图形是一个自定义视图,它表示用户可以在图形周围拖动以读取有关特定数据点的详细信息的十字线指针.

框架布局捕获所有触摸事件,在其每个子视图上调用"命中测试"方法,以确定触摸是否在该视图上,然后将触摸事件调度到适当的视图.

当用户触摸十字线并拖动它时,我将触摸事件传递给它用来更新它的位置并使其自身无效的十字线.

一切正常,除了......

当我使任何这些子视图无效时,布局中的所有视图都会重绘.我知道这一点,因为我在开发者选项中打开了"show screen updates".在任何时候我都不会使包含的FrameLayout无效 - 或者至少,不是故意的.

当然,处理布局的Activity不会使它失效,并且我在子视图中没有对父级的任何引用.

我没有发布代码,因为a)我不知道这可能是正常的行为,b)有很多它!c)如果这不是正常行为,我不知道代码的哪一部分存在问题.当然,我很乐意提供任何可能要求的东西.

我的最小API是2.3.3,我的目标是4.0.这两个版本都会发生这种情况,所以我怀疑我的代码是问题,但从哪里开始?

有关可能发生的事情的任何线索?

Dmi*_*sev 6

没有办法View绘制"只是自己",因为它依赖于它的父级(它提供了它的剪切和Canvas通过dispatchDraw方法翻译).失效需要整个视图树无效 - 这是你正在寻找的答案:)

如果你要查看源代码ViewGroup,你会发现有两个重要的方法:( dispatchDraw负责将绘制事件分配给它的孩子)和drawChild(通过调用dispatchDraw,让你指定如何绘制子项).注意,View虽然有一个RectF指定失效区域,但没有检查哪个开始失效.据我了解 - 你需要确保你的无效View(交叉)不占用整个屏幕,因此重绘将只是它实际需要的部分.