简介
啥是自定义View,就是在系统已经定义好的控件无法满足的情况下,我们自己去extends自我们的View或者ViewGroup去自己定义的View。
自定义View其实就是一些套路,比如onMeasure(),onDarw(),onLayout(),onTouch(),自定义属性,我们需要知道是用来干什么的,剩下就是一些逻辑代码了.
-
onMeasure():用于测量,你的控件占多大的地方由这个方法指定;
-
onLayout():用于布局,决定View在ViewGroup中的位置;
-
onDarw():用于绘制,你的控件呈现给用户长什么样子由这个方法决定;
-
onTouch():用于触摸,处理与用户交互,比如你手指拖动应该是什么效果由这个方法决定;
-
自定义属性:用于配置,布局中android:text="1"就显示1,android:text="2"就是显示2.
构造方法场景
// 如果View是在Java代码里面new的,则调用第一个构造函数
public CarsonView(Context context) {
this(context, null);
}
// 如果View是在.xml里声明的,则调用第二个构造函数
// 自定义属性是从AttributeSet参数传进来的
// 这个方法一般是必须重写的,因为在LayoutInfaltor中CreateView的时候,系统会通过反射调用该构造函数,如果没有重写创建View的时候会报错
public CarsonView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
// 不会自动调用
// 一般是在第二个构造函数里主动调用
// 如View有style属性时
public CarsonView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
//API21之后才使用
// 不会自动调用
// 一般是在第二个构造函数里主动调用
// 如View有style属性时
public CarsonView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
onMeasure()测量
测量模式:
-
UNSPECIFIED : 任意大小,想要多大就多大,尽可能大,一般我们不会遇到,如ListView,RecyclerView,ScrollView测量子View的时候给的就是UNSPECIFIED ,一般开发中不需要关注它; (ScrollView嵌套Listview导致显示不全就是因为ScrollView测量子view是UNSPECIFIED,Listview的onMeasure方法中测量模式是UNSPECIFIED时候就画一个item的高度,所以要把ListView的测量模式改为AT_MOST,并给定一个最大值,2的30次仿,一共32位,前两位是测量模式)
-
EXACTLY : 一个确定的值,比如在布局中你是这样写的layout_width="100dp","match_parent","fill_parent";
-
AT_MOST: 包裹内容,比如在布局中你是这样写的layout_width="wrap_content"。