我刚开始在Android中制作自定义视图,所以我还没有学习有关视图层次结构的绘制(绘制)周期的所有事实,以及View方法invalidate
和{{1}的有效使用}。但我遇到了令人费解的行为。
我有一个自定义视图组,扩展了 RelativeLayout 类。这是我的父母观点。在其中,作为孩子,我有几个自定义的子视图。有时,为了响应用户的操作,我需要重新绘制这些视图的各个部分,包括父级和小孩。
通常这是事件序列。在子视图类中,我通过调用onDraw
来使其中的一小部分无效,其中rct是划分我需要更新的区域的Rect。
令人费解的是,这种非常本地化的行为引发了一种真正过度的全球反应。似乎 - 从我的LogCat跟踪输出的证据 - :
(1)整个父视图经过完整的重绘
接下来是:
(2)每个子视图都经过完整的重绘
不可否认,如果回应(1)发生,那么(2)确实应该遵循,因为所有儿童意见都需要完全重新绘制。但为什么(1)会发生呢?
这是视图层次结构的绘制周期的正常行为吗?如果是这样,它似乎是错误的!我希望相反,只有父项的一小部分可能需要重绘,直接位于子视图中标记为脏的矩形的底部。重绘。而且,即使上层儿童在该区域内并非完全不透明,即使父母的那个小区域也需要重新绘制。
这个看似 nuke-the-lot 批量重绘活动的证据是,在每个自定义视图的每个onDraw方法主体中,我都有一个LogCat跟踪语句,如下所示:
invalidate(rct)
LogCat输出清楚地表明每个onDraw调用都是针对视图的整个表面。