不废话,先看效果图:
meter1.gif
表盘的绘制重点有两点:
1.表盘刻度的绘制
2.表盘指针旋转到指定刻度的实现
表盘刻度的绘制
刻度的绘制可以采用画线.然后循环旋转画布的方式实现,
我这里通过绘制弧线,第一个刻度占1度,与第二个刻度的间距是2度,那么第二个刻度的起始角度为第一个刻度的起始角度+1度+间距2度,以此类推,循环绘制,完成刻度的绘制.实现代码如下:
//绘制刻度线,通过两次不同大小圆的遮罩,达到刻度的长短粗细效果
RectF oval3 = new RectF(20, 20, sideLength-20, sideLength-20);//sideLength表盘控件的边长
float i1 = (270.0f-110) / 99;//第一次绘制细刻度线没有绘制粗刻度线,一共空缺10度所以-110
float startAngle = 135;
ArrayList floats = new ArrayList<>();
for (int i = 0; i < 100; i++) {
if (String.valueOf(i+1).contains("0")||i==0){
floats.add(startAngle);
startAngle = startAngle+i1+2;
}else{
canvas.drawArc(oval3, startAngle, 1, true, paint2);
startAngle = startAngle+i1+1;
}
}
canvas.drawCircle(sideLength/2, sideLength/2, sideLength/2-40, paint1);
for (int i = 0; i < floats.size(); i++) {//循环绘制粗刻度线
canvas.drawArc(oval3, floats.get(i), 2, true, quenLinePaint);
}
canvas.drawCircle(sideLength/2, sideLength/2, sideLength/2-50, paint1);
表盘指针旋转到指定刻度的实现
方式一:绘制一条直线,通过旋转画布的方式实现指针的旋转效果
canvas.save();//先保存之前的
canvas.rotate(row,200, 200);//延中心点旋转角度
canvas.drawLine(200,200,200,390,paint);//画线
canvas.restore();//恢复
2.方式二:通过圆函数,计算旋转任意角度后的圆上一点的坐标,然后绘制圆心到圆上一点的半径,就是指针的位置
x1 = x0 + r * cos(ao * 3.14 /180 )
y1 = y0 + r * sin(ao * 3.14 /180 )
float lineX = (float)(200+170*Math.cos(row*3.14f/180));
float lineY = (float)(200+170*Math.sin(row*3.14f/180));
canvas.drawLine(200,200,lineX,lineY,paint);
这里我采用的原理与方式一类似,只不过绘制的不是简单的直线而是多边形位图
canvas