美文网首页
自定义View

自定义View

作者: YXCheng | 来源:发表于2017-08-22 14:06 被阅读0次

    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);
        }
    

    效果图


    wode

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

    相关文章

      网友评论

          本文标题:自定义View

          本文链接:https://www.haomeiwen.com/subject/ljokdxtx.html