Android 自定义View之测量过程

170 阅读2分钟

前言

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

目录


作用

实现开发者对控件显示要求,合适的展示界面中控件大小

知识涉及

1.布局参数类:LayoutParams

作用:为该子View找到一个父容器,让子view在此父容器中使用正确的大小、正确的位置显示正确的内容。

创建一个View的对象一般会有两种方式

  1. 直接在代码中使用构造器new
  2. 在xml中写控件

上面两种方式都会用到布局参数,在xml中使用的layout_打头的属性实现,在java代码中可以通过view.getLayoutParams()方式获取。RelativeLayout布局对应RelativeLayoutParams,LinearLayout对应着LinearLayoutParams,


2.父View测量要求类:MeasureSpec


自定义测量过程详解

ViewGroup


View

单独的子view类型测量过程,不是一个ViewGroup

  1. 继承已有的系统组件或者是View
  2. 当布局过程来的时候,子view的measure()方法会被父View调用
  3. measure()方法里面会调用onMeasure()方法,真正进行测量的是onMeasure()方法
  4. 由于是一个单独的子view,所以不会向下递归的测量子view的尺寸,完成测量保存测量值

Layout类型测量过程

  1. 继承ViewGroup或者继承已有的Layout系统组件
  2. 当布局过程来的时候,子view的measure()方法会被父View调用
  3. 在此layout组件的onMeasure()方法中进行测量
  4. 遍历所有的子view
  5. 解析xml中每一个子View的layout_打头的属性,主要是layout_width、layout_height属性
  6. 拿宽度举例子,若子View的layout_width属性是Match_Parent,说明开发者对该子View的宽度显示要求是充满它的父控件,那么父View在测量子View的时候就会计算自己的可用空间
  7. 父View的可用空间怎么来?就是onMeasure()方法中的widthMeasureSpec参数中得来,所以对于子View的测量会结合子View的布局参数要求也即开发者对子View的显示要求+父View对子View的测量要求
  8. 算出每一个子View的尺寸之后,得到自己的测量尺寸