外观
invalidate 和 requestLayout 有什么区别?
标准回答
invalidate 表示内容需要更新,通常触发后续绘制;requestLayout 表示尺寸或布局关系可能变化,需要重新测量和布局。只改变颜色、进度或绘制内容时,我通常使用 invalidate;改变宽高、文本尺寸或影响父子布局的属性时,需要 requestLayout,很多属性 setter 会自行调用。实际 traversal 会根据脏标记合并多次请求,不是每调用一次就立刻完成一轮绘制。对已经挂载的 View,更新应在所属 UI 线程进行。
延伸追问
两者都不是立即送显的同步接口;不要为了保险在每次更新时无条件同时调用。
内容来源
- Android Framework 知识手册 · 原条目
2-6