基础知识

自定义 View 分类

自定义 View 的实现方式有以下几种:

类型定义
自定义组合控件多个控件组合成为一个新的控件,方便多处复用
继承系统 View 控件继承自TextView等系统控件,在系统控件的基础功能上进行扩展
继承 View不复用系统控件逻辑,继承View进行功能定义
继承系统 ViewGroup继承自LinearLayout等系统控件,在系统控件的基础功能上进行扩展
继承 View ViewGroup不复用系统控件逻辑,继承ViewGroup进行功能定义

从上到下越来越难,需要的了解的知识也是越来越多的。

构造函数

当我们在自定义 View 的时候,构造函数都是不可缺少,需要对构造函数进行重写,构造函数有多个,至少要重写其中一个才行。例如我们新建 MyTextView:
publicclass MyTextViewextends View {
/** * 在java代码里new的时候会用到 *@param context*/public MyTextView(Context context) {super(context); }/** * 在xml布局文件中使用时自动调用 *@param context*/public MyTextView(Context context, @Nullable AttributeSet attrs) {super(context, attrs); }/** * 不会自动调用,如果有默认style时,在第二个构造函数中调用 *@param context *@param attrs *@param defStyleAttr*/public MyTextView(Context context, @Nullable AttributeSet attrs,int defStyleAttr) {super(context, attrs, defStyleAttr); }/** * 只有在API版本>21时才会用到 * 不会自动调用,如果有默认style时,在第二个构造函数中调用 *@param context *@param attrs *@param defStyleAttr *@param defStyleRes*/ @RequiresApi(api= Build.VERSION_CODES.LOLLIPOP)public MyTextView(Context context, @Nullable AttributeSet attrs,int defStyleAttr,int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes); }
}
对于每一种构造函数的作用,都已经再代码里面写出来了。