1.Android的自定义view有几种,继承View,继承ViewGroup,或者继承特定的布局(例如:LinearLayout),下面介绍继承View这种方式
2.继承View,要重写onMeasure()方法,和onDraw()方法
3.首先是View的测量,onMeasure(int widthMeasureSpec,int heightMeasureSec)方法有两个参数,参数有两种信息,大小和模式
1)MeasureSpec.EXACTLY模式:xml布局的值是match_parent,或者值的大小已经明确;
2)MeasureSpec.AT_MOST模式:xml布局的值是wrap_content
3)MeasureSpec.UNSPECIFIED模式:父控件不强加任何约束给子控件,任何大小都可以
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int defaultSize = 200;//设置一个默认值 int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); if (widthMode == MeasureSpec.EXACTLY && heightMode == MeasureSpec.EXACTLY) { setMeasuredDimension(widthSize, heightSize); } else if (widthMode == MeasureSpec.AT_MOST && heightMode == MeasureSpec.EXACTLY) { setMeasuredDimension(defaultSize, heightSize); } else if (widthMode == MeasureSpec.EXACTLY && heightMode == MeasureSpec.AT_MOST) { setMeasuredDimension(widthSize, defaultSize); } else { setMeasuredDimension(defaultSize, defaultSize); } }
4.接下来重写onDraw()方法,画出想要的view,注意padding
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(); paint.setColor(Color.RED); paint.setStrokeWidth(5); int startX = getPaddingLeft(); int startY = getMeasuredHeight() / 2; int stopX = getMeasuredWidth() - getPaddingRight(); //画出一条线 canvas.drawLine(startX, startY, stopX, startY, paint); }