自定义View


1.自定义view的实现

因为Android系统内置的view不能满足我们的项目需求,所以我们要定制自己的view。实现自定义view我们大部分的时候需要实现两个方法:onMeasure()方法和onDraw()方法。其中onMeasure()方法是用来测量当前view的大小,onDraw()方法是将view绘制出来。同时,我们的自定义view要实现三个构造方法:

     public MyView(Context context) {
        super(context);
    }

    public MyView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

1.1 onMeasure()方法

我们实现自定义view ,首先要测量宽高尺寸。当view类的默认处理不能满足我们的要求的时候,我们要重写onMeasure()方法.

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)

其中,widthMeasureSpec和heightMeasureSpec分别包含了宽高的尺寸以及测量模式。但是这时候有一个问题:一个int型数据怎么能存放两个信息?Google爸爸的实现方法是将int型的前两个bit用来区分不同的测试模式,后30bit用来存放尺寸大小。并且Google爸爸提供一个内置类:MeasureSpec来处理数据。

    int widthMode = MeasureSpec.getMode(widthMeasureSpec);
    int widthSize = MeasureSpec.getSize(widthMeasureSpec);

那么,问题又来了。既然我们可以通过内置类(MeasureSpec)来获取view的大小,那我们为什么还要拿到测量模式?我们要注意,这里我们获得的尺寸是父view提供给我们的参考的,并不是当前view真正的尺寸大小。
测量模式有三种:

         //获取测量模式
         int mode = MeasureSpec.getMode(measureSpec);
         
         switch(mode){

            //父容器没有对当前view有任何限制,当前view可以取任意值
            case MeasureSpec.UNSPECIFIED:
                break;

            //当前的尺寸就是当前view应该设置的尺寸
            case MeasureSpec.EXACTLY:
                break;

            //当前尺寸是当前view能取到的最大尺寸
            case MeasureSpec.AT_MOST:
                break;
        }

1.2 onDraw()方法

onMeasure()方法用来实现自定义寸尺,那么onDraw()就是用来绘制我们的view。我们可以绘制不同类型的view来满足我们的需求。下面来绘制一个圆形:

 @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //获取圆的半径,因为我们的view的宽高是一样,所以getMeasureHeight也是可以的
        int r = getMeasuredWidth()/2;
        Log.e(TAG, "onDraw: r" + r );

        //获取圆心的X坐标
        int centerX = getLeft()+r;
        Log.e(TAG, "onDraw: getLeft " + getLeft() );

        //获取圆心的坐标
        int centerY = getTop()+r;
        Log.e(TAG, "onDraw: getTop " + getTop() );

        //创建一个画笔
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        
        //画圆形
        canvas.drawCircle(centerX,centerY,r,paint);
    }

效果图


自定义View_第1张图片
wode

注:
该文章引用自huachao1001的文章 ,这是去往该作者的链接.

你可能感兴趣的:(自定义View)