Skip to content
阅读进度

为什么在自定义 View 中重写 onDraw() 时需要调用 invalidate()? ​

返回 View 与显示链路 目录

标准回答 ​

invalidate() 请求后续重绘,onDraw(Canvas) 是系统绘制时调用的回调;调用 invalidate 不会立即同步执行 onDraw。外观内容变了请求 invalidate,可能改变尺寸或位置则还需要 requestLayout。

**什么时候调用:**颜色、进度或自定义绘制数据改变时请求重画;持续动画可按帧安排更新。不要无条件在 onDraw 内再次 invalidate,否则会不断触发重绘。

通俗例子 ​

进度条从 30% 变成 40%,更新数值后调用 invalidate。若 onDraw 无条件再次 invalidate,即使数值没变,也可能不停重画。

深入解释 ​

**重绘做什么:**invalidate 把需要更新的区域标为待绘制,系统在后续合适的绘制时机处理;调用结束不等于 onDraw 已经执行,更不等于像素已显示。

**什么时候重新布局:**只改进度或颜色,一般请求重绘;内容变化使期望宽高改变,还要 requestLayout 触发测量和布局。布局请求也可能让系统随后重绘。

易混淆点 ​

原题前提不准确:onDraw 内无条件 invalidate 可能造成持续绘制和耗电。

参考资料 ​

内容来源 ​

用完整回答理解机制,用真实证据解释项目。