先看效果
Paste_Image.png完整代码如下
整个圆弧280,分为7份,每份角度为40°。
package example.com.dashbarddemo;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.view.View;
public class BoardView extends View {
private TextPaint textPaint;
private Paint linePaint;
private float centerX;
private float centerY;
private String[] texts;
private float radius;
private Rect rect;
//大刻度线距离文字的距离
private float text2line;
//小刻度线距离文字的距离
private float text2lineshorter;
private Paint arcPaint;
private Paint stripPaint;
private float angle=0.001f;
//蓝色弧形的宽度
private float stripStrokeWidth;
private Paint mPaint;
//最外层弧线的宽度
private float strokWidth;
private Paint circlePaint;
private RectF rectF;
private RectF rectF2;
private RectF rectF3;
private RectF rectF4;
//刻度线宽度
private float ticksWidth=dp2px(2);
//刻度线长度
private float ticksHeight=dp2px(20);
public float getAngle() {
return angle;
}
public void setAngle(float angle) {
this.angle = angle;
invalidate();
}
public BoardView(Context context) {
this(context,null);
}
public BoardView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public BoardView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//文字
textPaint = new TextPaint();
textPaint.setAntiAlias(true);
textPaint.setTextSize(20);
textPaint.setColor(Color.BLACK);
//刻度线
linePaint = new Paint();
linePaint.setAntiAlias(true);
linePaint.setColor(Color.parseColor("#dedede"));
linePaint.setStrokeWidth(ticksWidth);
texts = new String[]{"250","350","450","550","650","750","850","950"};
//文字的宽高
rect = new Rect();
textPaint.getTextBounds(texts[0],0,texts[0].length(), rect);
text2line = dp2px(10);
text2lineshorter = dp2px(6);
//圆环
arcPaint = new Paint();
arcPaint.setAntiAlias(true);
arcPaint.setStyle(Paint.Style.STROKE);
arcPaint.setStrokeWidth(dp2px(2));
arcPaint.setColor(Color.BLACK);
//白条
stripPaint = new Paint();
stripPaint.setAntiAlias(true);
stripPaint.setStyle(Paint.Style.STROKE);
stripPaint.setColor(Color.WHITE);
stripStrokeWidth = dp2px(12);
stripPaint.setStrokeWidth(stripStrokeWidth);
//最外层圆弧
mPaint = new Paint();
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setAntiAlias(true);
mPaint.setColor(Color.parseColor("#7fffffff"));
strokWidth = dp2px(3);
mPaint.setStrokeWidth(strokWidth);
//光点
circlePaint = new Paint();
circlePaint.setAntiAlias(true);
circlePaint.setColor(Color.WHITE);
circlePaint.setStyle(Paint.Style.FILL_AND_STROKE);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
//圆心
centerX = getMeasuredWidth()/2;
centerY = getMeasuredHeight()/2;
//半径
radius = getMeasuredWidth()/2*0.6f;
rectF = new RectF();
rectF.left=-radius-dp2px(21);
rectF.top=-radius-dp2px(21);
rectF.right=radius+dp2px(21);
rectF.bottom=radius+dp2px(21);
rectF2 = new RectF();
rectF2.left=-radius-dp2px(35);
rectF2.top=-radius-dp2px(35);
rectF2.right=radius+dp2px(35);
rectF2.bottom=radius+dp2px(35);
rectF3 = new RectF();
rectF3.left=-radius-dp2px(22)-stripStrokeWidth/2;
rectF3.top=-radius-dp2px(22)-stripStrokeWidth/2;
rectF3.right=radius+dp2px(22)+stripStrokeWidth/2;
rectF3.bottom=radius+dp2px(22)+stripStrokeWidth/2;
rectF4 = new RectF();
rectF4.left=-radius-dp2px(45)-strokWidth/2;
rectF4.top=-radius-dp2px(45)-strokWidth/2;
rectF4.right=radius+dp2px(45)+strokWidth/2;
rectF4.bottom=radius+dp2px(45)+strokWidth/2;
}
@Override protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.translate(centerX,centerY);
//绘制文字
for(int i=0;i<texts.length;i++){
canvas.save();
canvas.rotate(-140+40*i);
canvas.drawText(texts[i],0-rect.width()/2,-radius,textPaint);
canvas.restore();
}
//绘制刻度线
for(int i=0;i<36;i++){
canvas.save();
canvas.rotate(-140+i*8);
if(i%5==0){
canvas.drawLine(0,-radius-dp2px(20),0,-radius-dp2px(20)+text2line,linePaint);
}else{
canvas.drawLine(0,-radius-dp2px(20),0,-radius-dp2px(20)+text2lineshorter,linePaint);
}
canvas.restore();
}
//刻度线所在内圆环
canvas.drawArc(rectF,130,280,false,arcPaint);
//刻度线所在外圆环
canvas.drawArc(rectF2,130,280,false,arcPaint);
//闭合圆环
canvas.save();
canvas.rotate(-140);
canvas.drawLine(0,-radius-dp2px(20),0,-radius-dp2px(36),arcPaint);
canvas.rotate(280);
canvas.drawLine(0,-radius-dp2px(20),0,-radius-dp2px(36),arcPaint);
canvas.restore();
//白条
canvas.drawArc(rectF3,130,angle,false,stripPaint);
//弧线
canvas.drawArc(rectF4,130,angle,false,mPaint);
//光点
canvas.save();
canvas.rotate(angle);
float distance=radius+dp2px(45)+strokWidth/2;
canvas.drawCircle((float) (-distance*Math.sin(Math.toRadians(40))),(float)(distance*Math.cos(Math.toRadians(40))),dp2px(3),circlePaint);
canvas.restore();
canvas.restore();
}
private float dp2px(float dp){
return getContext().getResources().getDisplayMetrics().density*dp+0.5f;
}
}
部分解说
文字绘制部分
//绘制文字
for(int i=0;i<texts.length;i++){
canvas.save();
canvas.rotate(-140+40*i);
canvas.drawText(texts[i],0-rect.width()/2,-radius,textPaint);
canvas.restore();
}
网友评论