外观
为什么在自定义 View 中重写 onDraw() 时需要调用 invalidate()?
标准回答
invalidate() 请求后续重绘,onDraw(Canvas) 是系统绘制时调用的回调;调用 invalidate 不会立即同步执行 onDraw。外观内容变了请求 invalidate,可能改变尺寸或位置则还需要 requestLayout。
**什么时候调用:**颜色、进度或自定义绘制数据改变时请求重画;持续动画可按帧安排更新。不要无条件在 onDraw 内再次 invalidate,否则会不断触发重绘。
通俗例子
进度条从 30% 变成 40%,更新数值后调用 invalidate。若 onDraw 无条件再次 invalidate,即使数值没变,也可能不停重画。
深入解释
**重绘做什么:**invalidate 把需要更新的区域标为待绘制,系统在后续合适的绘制时机处理;调用结束不等于 onDraw 已经执行,更不等于像素已显示。
**什么时候重新布局:**只改进度或颜色,一般请求重绘;内容变化使期望宽高改变,还要 requestLayout 触发测量和布局。布局请求也可能让系统随后重绘。
易混淆点
原题前提不准确:onDraw 内无条件 invalidate 可能造成持续绘制和耗电。
参考资料
内容来源
- Android · AI Agent 知识手册 · 原条目
2.1.2