Android 自定义 View 和 ViewGroup 简要总结
主要方法及作用
- 自定义 ViewGroup 主要涉及的方法如下:
- onMeasure() 计算 childView 的测量值以及模式,以及设置自己的宽和高。
- onLayout() 对所有 childView 进行定位。
- 自定义 View 主要涉及的方法如下:
- onMeasure() 测量 View 的宽和高。
- onDraw() 将 View 绘制到屏幕上。
测量模式
onMeasure() 过程和测量模式相关,而测量模式分为三种:
- UNSPECIFIED:父容器不对 View 有任何限制,要多大给多大。这种情况一般用于系统内部。
- EXACTLY:父容器已经检测出 View 所需要的精确大小,这个时候 View 的最终大小就是 SpecSize 所指定的值。它对应 LayoutParams 中的 mactch_parent 和具体数值这两种模式。
- AT_MOST 父容器指定了一个可用大小即 SpecSize,View 的大小不能大于这个值,具体值看不同 View 的具体实现。它对应于 LayoutParams 中的 wrap_content。
LayoutParams 和 generateLayoutParams
LayoutParams的官方文档解释如下:
1.LayoutParams are used by views to tell their parents how they want to be laid out. -- LayoutParams 是 View 用来告诉它的父控件如何放置自己的。
2.The base LayoutParams class just describes how big the view wants to be for both width and height. -- 基类 LayoutParams(也就是 ViewGroup.LayoutParams)仅仅描述了这个 View 想要的宽度和高度。
3.There are subclasses of LayoutParams for different subclasses of ViewGroup. -- 不同 ViewGroup 的继承类对应着不同的 ViewGroup.LayoutParams 的子类。
generateLayoutParams官方文档解释如下:
Returns a new set of layout parameters based on the supplied attributes set. -- 根据提供的属性集返回一组新的布局参数。
在 addView() 的执行过程当中,如果 checkLayoutParams() 检测到传递过来的 LayoutParams 不是对应布局的 LayoutParam,则会通过 generateLayoutParams() 根据你传递的 LayoutParams 的属性构造一个对应布局的 LayoutParams。
参考资料
- Android 手把手教您自定义ViewGroup(一)
- 自定义控件知识储备-LayoutParams的那些事