外观
如何理解自定义 View 的测量、绘制与触摸?
标准回答
MeasureSpec 表达父布局给予的尺寸约束,常见模式是精确、上限和未指定。自定义 View 应尊重约束并提供合理的 wrap_content 尺寸,处理 padding 和内容最小值;测量结果再由 layout 决定位置,draw 负责像素内容。
invalidate 表达需要重绘,requestLayout 表达尺寸或布局可能变化。频繁 requestLayout 会扩大遍历成本,onDraw 中创建大对象会增加分配压力。动画优先只更新必要属性,静态几何和可复用对象在合适阶段缓存并在配置变化后更新。
触摸区域应与实际变换后的位置一致,处理点击语义和取消,避免只画得出来却无法正确操作。复杂控件还要考虑无障碍、键盘焦点与状态恢复,不能仅用截图判断组件实现完成。
追问与回答
onDraw 没调用是不是 invalidate 失效
检查可见性、尺寸、父容器优化、绘制实现和线程;也可能内容使用独立 Surface,不能只看普通 View 绘制回调。
为什么嵌套布局变慢
可能重复测量、权重分配、复杂约束或大量节点造成额外遍历,需用实际层级和 Trace 定位,而非一律改成同一种布局。
易混淆点
- 把重绘和重新布局当成同一操作。
参考资料
内容来源
- Android 与 AI 工程 Wiki · 原条目
q196