自定义绘制图片--参照上文,绘制了一个钟表
其实学习知识,只有自己一边绘制,一边了解才会学习的快呢,文章最后会附上项目地址:
不管是绘制多么复杂的控件,都需要一步一步的进行,
-
首先是在绘制之前先重写onMeasure()方法,测量和设置控件的一些大小
setMeasuredDimension(measure(widthMeasureSpec, true), measure(heightMeasureSpec, false));int specMode = MeasureSpec.getMode(origin);//得到模式 int specSize = MeasureSpec.getSize(origin);//得到尺寸
判断specMode:
// EXACTLY是精确尺寸,当我们将控件的layout_width或layout_height指定为具体数值时如"50dip",或者为FILL_PARENT是,都是控件大小已经确定的情况,都是精确尺寸。
case MeasureSpec.EXACTLY:
//AT_MOST是最大尺寸,当控件的layout_width或layout_height指定为WRAP_CONTENT时,控件大小一般随着控件的子空间或内容进行变化,此时控件尺寸只要不超过父控件允许的最大尺寸即可
case MeasureSpec.AT_MOST:
//UNSPECIFIED是未指定尺寸,这种情况不多,一般都是父控件是AdapterView,通过measure方法传入的模式。
case MeasureSpec.UNSPECIFIED:
-
首先是绘制外面最大的圆形
//画外圆
float borderWidth = DEFAULT_BORDER_WIDTH;
float r = Math.min(getHeight() / 2, getWidth() / 2) - borderWidth / 2;//半径
Paint paintCircle = new Paint();/** * Paint.Style.FILL :填充内部 Paint.Style.FILL_AND_STROKE :填充内部和描边 Paint.Style.STROKE :仅描边 */ paintCircle.setStyle(Paint.Style.STROKE);//设置填充样式 paintCircle.setAntiAlias(true);//抗锯齿功能 paintCircle.setStrokeWidth(borderWidth);//设置画笔宽度 canvas.drawCircle(getWidth() / 2, getHeight() / 2, r, paintCircle);//画圆,圆心在中心位置,半径为长宽小者的一半
不知道为什么复制代码的时候,格式就乱了还要一个一个的去修改,这里我就不贴了,直接上传我的
github项目
有兴趣的同学可以看下,代码里面的注视很全,应该都可以看得懂