gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:05 26 4
gpt4 key购买 nike

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

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

框架布局捕获所有触摸事件,在其每个 subview 上调用“ HitTest ”方法以确定触摸是否在该 View 上,然后将触摸事件分派(dispatch)到适当的 View 。

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

一切正常,除了...

当我使这些 subview 中的任何一个无效时,布局中的所有 View 都将重绘。我知道这一点,因为我在开发人员选项中打开了“显示屏幕更新”。在任何时候我都不会使包含的 FrameLayout 无效——或者至少是在不知情的情况下。

当然,处理布局的 Activity 不会使其无效,而且我在 subview 中没有对父级的任何引用。

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

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

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

最佳答案

View 无法“仅自身”绘制,因为它依赖于它的父级(它提供了通过 dispatchDraw< 裁剪和翻译的 Canvas/ 方法)。失效需要使整个 View 树失效 - 这就是您正在寻找的答案:)

如果您查看ViewGroup 的源代码,您会发现其中有两个重要的方法:dispatchDraw(负责将绘制事件分派(dispatch)给它的子项)和 drawChild(由 dispatchDraw 调用,让您指定如何绘制 child )。请注意,没有检查哪个 View 开始失效,尽管有一个指定失效区域的 RectF。据我了解 - 您需要确保您的无效 View(交叉)不会占据整个屏幕,因此重绘将只是它实际占据的那部分。

关于android - 当我使其中一个 View 无效时,为什么我的布局会完全重绘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17185143/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com