引言
自定义View的流程及知识点比较多,所以直接整理了学的博客内容,多阅读整理学习
1.安卓自定义View流程原理
自定义View的实现方式有以下几种
类型 | 定义 |
---|---|
自定义组合控件 | 多个控件组合成为一个新的控件,方便多处复用 |
继承系统View控件 | 继承自TextView等系统控件,在系统控件的基础功能上进行扩展 |
继承View | 不复用系统控件逻辑,继承View进行功能定义 |
继承系统ViewGroup | 继承自LinearLayout等系统控件,在系统控件的基础功能上进行扩展 |
继承ViewViewGroup | 不复用系统控件逻辑,继承ViewGroup进行功能定义 |
View的绘制基本由measure()、layout()、draw()这个三个函数完成
函数 | 作用 | 相关方法 |
---|---|---|
measure() | 测量View的宽高 | measure(),setMeasuredDimension(),onMeasure() |
layout() | 计算当前View以及子View的位置 | layout(),onLayout(),setFrame() |
draw() | 视图的绘制工作 | draw(),onDraw() |
View坐标系内部视图:
View的绘制基本由measure()、layout()、draw()这个三个函数完成
函数 | 作用 | 相关方法 |
---|---|---|
measure() | 测量View的宽高 | measure(),setMeasuredDimension(),onMeasure() |
layout() | 计算当前View以及子View的位置 | layout(),onLayout(),setFrame() |
draw() | 视图的绘制工作 | draw(),onDraw() |
对于View来说,MeasureSpec
的 mode 和 Size 有如下意义
模式 | 意义 | 对应 |
---|---|---|
EXACTLY | 精准模式,View需要一个精确值,这个值即为MeasureSpec当中的Size | match_parent |
AT_MOST | 最大模式,View的尺寸有一个最大值,View不可以超过MeasureSpec当中的Size值 | wrap_content |
UNSPECIFIED | 无限制,View对尺寸没有任何限制,View设置为多大就应当为多大 | 一般系统内部使用 |
2. View 的绘制机制吗,能说一下吗?
3.一个View被添加后第一个回调的方法是哪个(onAttacthToWindow)
4. 为什么View.post能拿到view的宽高
在
onResume
时view
才会被添加在window
内并且执行view
的测量布局绘制 这就是为什么在onCreate()
时获取到view
宽高会是0的原因,因为那时view
都没有添加进window
呢!!!
5.刷新机制
6.LayoutInflater#inflate 的 attrachToParent true 是什么意思
inflate(int resource, ViewGroup root, boolean attachToRoot)
如果root为null,attachToRoot将失去作用,设置任何值都没有意义。
如果root不为null,attachToRoot设为true,则会给加载的布局文件的指定一个父布局,即root。
如果root不为null,attachToRoot设为false,则会将布局文件最外层的所有layout属性进行设置,当该view被添加到父view当中时,这些layout属性会自动生效。
在不设置attachToRoot参数的情况下,如果root不为null,attachToRoot参数默认为true。
7.theme 和 style 有什么区别,优先级
8.你知道哪些Layout,ConstraintLayout 的特点是什么
-
LinearLayout(线性布局),垂直或者水平方向排列
-
RelativeLayout(相对布局),可设置相对位置
-
TableLayout(表格布局) ,适用于多行多咯额
-
FrameLayout(帧布局),将所有的子元素放在整个界面的左上角,后面的子元素直接覆盖前面的子元素
-
AbsoluteLayout(绝对布局),
-
GridLayout(网格布局)
-
ConstraintLayout (约束布局)