Android 自定义 View 和 ViewGroup 简要总结

主要方法及作用

  1. 自定义 ViewGroup 主要涉及的方法如下:
    • onMeasure() 计算 childView 的测量值以及模式,以及设置自己的宽和高。
    • onLayout() 对所有 childView 进行定位。
  2. 自定义 View 主要涉及的方法如下:
    • onMeasure() 测量 View 的宽和高。
    • onDraw() 将 View 绘制到屏幕上。

测量模式

onMeasure() 过程和测量模式相关,而测量模式分为三种:

  1. UNSPECIFIED:父容器不对 View 有任何限制,要多大给多大。这种情况一般用于系统内部。
  2. EXACTLY:父容器已经检测出 View 所需要的精确大小,这个时候 View 的最终大小就是 SpecSize 所指定的值。它对应 LayoutParams 中的 mactch_parent 和具体数值这两种模式。
  3. 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。


参考资料

  1. Android 手把手教您自定义ViewGroup(一)
  2. 自定义控件知识储备-LayoutParams的那些事