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的文章 ,这是去往该作者的链接.
网友评论