前言
Android 中的自定义View涉及的知识点不仅多而且杂,网上的资料很多,基于此前原先一些大佬们的blog阅读,于今天记录一下自己的学习所得。
目录

作用
实现开发者对控件显示要求,合适的展示界面中控件大小
知识涉及
1.布局参数类:LayoutParams
作用:为该子View找到一个父容器,让子view在此父容器中使用正确的大小、正确的位置显示正确的内容。
创建一个View的对象一般会有两种方式
- 直接在代码中使用构造器new
- 在xml中写控件
上面两种方式都会用到布局参数,在xml中使用的layout_打头的属性实现,在java代码中可以通过view.getLayoutParams()方式获取。RelativeLayout布局对应RelativeLayoutParams,LinearLayout对应着LinearLayoutParams,
2.父View测量要求类:MeasureSpec

自定义测量过程详解
ViewGroup

View

单独的子view类型测量过程,不是一个ViewGroup
- 继承已有的系统组件或者是View
- 当布局过程来的时候,子view的measure()方法会被父View调用
- measure()方法里面会调用onMeasure()方法,真正进行测量的是onMeasure()方法
- 由于是一个单独的子view,所以不会向下递归的测量子view的尺寸,完成测量保存测量值
Layout类型测量过程
- 继承ViewGroup或者继承已有的Layout系统组件
- 当布局过程来的时候,子view的measure()方法会被父View调用
- 在此layout组件的onMeasure()方法中进行测量
- 遍历所有的子view
- 解析xml中每一个子View的layout_打头的属性,主要是layout_width、layout_height属性
- 拿宽度举例子,若子View的layout_width属性是Match_Parent,说明开发者对该子View的宽度显示要求是充满它的父控件,那么父View在测量子View的时候就会计算自己的可用空间
- 父View的可用空间怎么来?就是onMeasure()方法中的widthMeasureSpec参数中得来,所以对于子View的测量会结合子View的布局参数要求也即开发者对子View的显示要求+父View对子View的测量要求
- 算出每一个子View的尺寸之后,得到自己的测量尺寸