Skip to content
阅读进度

如何理解自定义 View 的测量、绘制与触摸? ​

返回 View 与显示链路 目录

标准回答 ​

MeasureSpec 表达父布局给予的尺寸约束,常见模式是精确、上限和未指定。自定义 View 应尊重约束并提供合理的 wrap_content 尺寸,处理 padding 和内容最小值;测量结果再由 layout 决定位置,draw 负责像素内容。

invalidate 表达需要重绘,requestLayout 表达尺寸或布局可能变化。频繁 requestLayout 会扩大遍历成本,onDraw 中创建大对象会增加分配压力。动画优先只更新必要属性,静态几何和可复用对象在合适阶段缓存并在配置变化后更新。

触摸区域应与实际变换后的位置一致,处理点击语义和取消,避免只画得出来却无法正确操作。复杂控件还要考虑无障碍、键盘焦点与状态恢复,不能仅用截图判断组件实现完成。

追问与回答 ​

onDraw 没调用是不是 invalidate 失效 ​

检查可见性、尺寸、父容器优化、绘制实现和线程;也可能内容使用独立 Surface,不能只看普通 View 绘制回调。

为什么嵌套布局变慢 ​

可能重复测量、权重分配、复杂约束或大量节点造成额外遍历,需用实际层级和 Trace 定位,而非一律改成同一种布局。

易混淆点 ​

  • 把重绘和重新布局当成同一操作。

参考资料 ​

内容来源 ​

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