引言

自定义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坐标系内部视图:

ios view 自定义构造函数 自定义view流程_ios 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 的绘制机制吗,能说一下吗?

requestLayout和invalidate方法

ios view 自定义构造函数 自定义view流程_android_02

3.一个View被添加后第一个回调的方法是哪个(onAttacthToWindow)

浅谈自定义View中一些常用的回调方法

4. 为什么View.post能拿到view的宽高

onResumeview 才会被添加在window内并且执行view的测量布局绘制 这就是为什么在onCreate()时获取到view宽高会是0的原因,因为那时view都没有添加进window呢!!!

ios view 自定义构造函数 自定义view流程_android_03

5.刷新机制

ios view 自定义构造函数 自定义view流程_自定义_04

6.LayoutInflater#inflate 的 attrachToParent true 是什么意思

inflate(int resource, ViewGroup root, boolean attachToRoot)
  1. 如果root为null,attachToRoot将失去作用,设置任何值都没有意义。
  2. 如果root不为null,attachToRoot设为true,则会给加载的布局文件的指定一个父布局,即root。
  3. 如果root不为null,attachToRoot设为false,则会将布局文件最外层的所有layout属性进行设置,当该view被添加到父view当中时,这些layout属性会自动生效。
  4. 在不设置attachToRoot参数的情况下,如果root不为null,attachToRoot参数默认为true。

7.theme 和 style 有什么区别,优先级

8.你知道哪些Layout,ConstraintLayout 的特点是什么

  • LinearLayout(线性布局),垂直或者水平方向排列
  • RelativeLayout(相对布局),可设置相对位置
  • TableLayout(表格布局) ,适用于多行多咯额
  • FrameLayout(帧布局),将所有的子元素放在整个界面的左上角,后面的子元素直接覆盖前面的子元素
  • AbsoluteLayout(绝对布局),
  • GridLayout(网格布局)
  • ConstraintLayout (约束布局)

9.View的第一次绘制是怎么调到的,View的后续绘制是怎么调用的

10.讲一些自己做过的自定义VIew的例子

11.FlowLayout怎么实现