自定义View初步

131 阅读2分钟

简介

啥是自定义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"。

  • 参考1:blog.csdn.net/z_zT_T/arti…

  • 参考2:www.jianshu.com/p/653a86fe4…