先看效果图
本来公司是这么一个需求,但是呢,等我写到一半又改了,改界面这种搬砖的活儿也是够蛋疼的
还是把这个快代码分享一下,但是没有适配,并且进度条的旋转的指针变化也还没写
分成三个view的实现
public class DashBoardViewViewLeft extends View {
private float progressWidth;
private String tempText;
private float tempTextSize;
private Paint scaleArcPaint; // 刻度弧
private Paint scalePaint; // 刻度
private Paint panelTextPaint; // 表盘文字
private Paint progressTextPaint; // 进度条上的文字
private Paint pointPaint; // 中心圆
private Paint leftPointerPaint; // 表针左半部分
private Paint rightPointerPaint; // 表针右半部分
private Paint pointerCirclePaint; // 表针的圆轴
private int mSize; // 最终的大小
private static final int PADDING = 15; // 进度的宽度
private static final int OFFSET = 5;
private String scale; // 刻度数值
private int mTikeCount = 20; // 40条刻度(包括长短)
private int mLongTikeHeight = dp2px(10); // 长刻度
private int mShortTikeHeight = dp2px(5); // 短刻度
private int scaleArcRadius; // 刻度弧的半径
private int pointRadius = dp2px(10); // 中心圆半径
private float currentTemp;//当前的值
private int startangle = 150;
private int sweepangle = 180;
public DashBoardViewViewLeft(Context context) {
this(context, null);
}
public DashBoardViewViewLeft(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public DashBoardViewViewLeft(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// 获取自定义属性
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.temperatureProgress);
progressWidth = ta.getDimension(R.styleable.temperatureProgress_progressWidth, PADDING);
tempText = ta.getString(R.styleable.temperatureProgress_tempText);
tempTextSize = ta.getDimension(R.styleable.temperatureProgress_tempTextSize, sp2px(15));
ta.recycle();
initPaint();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int realWidth = startMeasure(widthMeasureSpec);
int realHeight = startMeasure(heightMeasureSpec);
/**
* 因为是以正方形为基础
*/
mSize = Math.min(realHeight, realWidth);
setMeasuredDimension(mSize, mSize);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 将画布移到中央
canvas.translate(mSize / 2, mSize / 2);
canvas.save();
canvas.rotate(-45);
// 画表盘
drawPanel(canvas);
canvas.restore();
// 绘制文字
drawPanelText(canvas);
}
/**
* 表盘
*
* @param canvas
*/
private void drawPanel(Canvas canvas) {
// 画刻度弧
drawScaleArc(canvas);
// 画中间圆
drawInPoint(canvas);
// 画指针
drawPointer(canvas);
}
/**
* 表盘上的文字
*
* @param canvas
*/
private void drawPanelText(Canvas canvas) {
canvas.save();
String text = "MINUTE";
float length = panelTextPaint.measureText(text);
panelTextPaint.setTextSize(sp2px(10));
canvas.drawText(text, -length / 2, scaleArcRadius / 2 - dp2px(5), panelTextPaint);
// String temp = currentTemp + "KM";
// panelTextPaint.setTextSize(sp2px(12));
panelTextPaint.setColor(tempTextColor);
// float tempTextLength = panelTextPaint.measureText(temp);
// canvas.drawText(temp, -tempTextLength / 2, mSize / 2+20, panelTextPaint);
canvas.restore();
}
/**
* 指针(这里分为左右部分是为了画出来的指针有立体感)
*
* @param canvas
*/
private void drawPointer(Canvas canvas) {
RectF rectF = new RectF(-pointRadius / 2, -pointRadius / 2, pointRadius / 2, pointRadius / 2);
canvas.save();
// 先将指针与刻度0位置对齐
canvas.rotate(240, 0, 0);
float angle = currentTemp * 6.0f;
canvas.rotate(angle, 0, 0);
// 表针左半部分
Path leftPointerPath = new Path();
leftPointerPath.moveTo(pointRadius / 2, 0);
leftPointerPath.addArc(rectF, 0, 360);
leftPointerPath.lineTo(0, scaleArcRadius - mLongTikeHeight - dp2px(OFFSET) - dp2px(15));
leftPointerPath.lineTo(-pointRadius / 2, 0);
leftPointerPath.close();
// 表针右半部分
Path rightPointerPath = new Path();
rightPointerPath.moveTo(-pointRadius / 2, 0);
rightPointerPath.addArc(rectF, 0, -180);
rightPointerPath.lineTo(0, scaleArcRadius - mLongTikeHeight - dp2px(OFFSET) - dp2px(15));
rightPointerPath.lineTo(0, pointRadius / 2);
rightPointerPath.close();
// 表针的圆
Path circlePath = new Path();
circlePath.addCircle(0, 0, pointRadius / 4, Path.Direction.CW);
canvas.drawPath(leftPointerPath, leftPointerPaint);
canvas.drawPath(rightPointerPath, rightPointerPaint);
canvas.drawPath(circlePath, pointerCirclePaint);
canvas.restore();
}
/**
* 中心圆
*
* @param canvas
*/
private void drawInPoint(Canvas canvas) {
canvas.save();
canvas.drawCircle(0, 0, pointRadius, pointPaint);
canvas.restore();
}
/**
* 刻度弧
*
* @param canvas
*/
private void drawScaleArc(Canvas canvas) {
// 刻度弧紧靠进度弧
scaleArcRadius = mSize / 2 - dp2px(PADDING) / 4;
canvas.save();
// 画弧的矩形
RectF rectF = new RectF(-scaleArcRadius, -scaleArcRadius, scaleArcRadius, scaleArcRadius);
//画外边缘弧线
//canvas.drawArc(rectF, startangle, sweepangle + 100, false, scaleArcPaint);
canvas.drawArc(rectF, 0, 360, false, scaleArcPaint);
// 画布回正
canvas.rotate(240, 0, 0);
// 旋转的角度
float mAngle = sweepangle / mTikeCount;
// 画右半部分的刻度
for (int i = 0; i <= mTikeCount; i++) {
// 5的倍数就画长刻度,并标上刻度数值
if (i % 5 == 0) {
scale = 40 - 2 * i + "";
panelTextPaint.setTextSize(sp2px(12));
float scaleWidth = panelTextPaint.measureText(scale);
canvas.drawLine(0, -scaleArcRadius, 0, -scaleArcRadius + mLongTikeHeight, scalePaint);
canvas.drawText(scale, -scaleWidth / 2, -scaleArcRadius + mLongTikeHeight + dp2px(12), panelTextPaint);
} else {
canvas.drawLine(0, -scaleArcRadius, 0, -scaleArcRadius + mShortTikeHeight, scalePaint);
}
canvas.rotate(mAngle, 0, 0);
}
// 画布回正
canvas.restore();
}
/**
* 测量大小
*/
private int startMeasure(int whSpec) {
int result = 0;
int size = MeasureSpec.getSize(whSpec);
int mode = MeasureSpec.getMode(whSpec);
if (mode == MeasureSpec.EXACTLY) {
result = size;
} else {
result = dp2px(220);
}
return result;
}
/**
* 将 dp 转换为 px
*/
private int dp2px(int dp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());
}
private int sp2px(int sp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, getResources().getDisplayMetrics());
}
/**
* 初始化画笔
*/
private void initPaint() {
scaleArcPaint = new Paint();
scalePaint = new Paint();
panelTextPaint = new Paint();
progressTextPaint = new Paint();
pointPaint = new Paint();
leftPointerPaint = new Paint();
rightPointerPaint = new Paint();
pointerCirclePaint = new Paint();
scaleArcPaint.setAntiAlias(true);
scaleArcPaint.setStrokeWidth(dp2px(2));
scaleArcPaint.setStyle(Paint.Style.STROKE);
scaleArcPaint.setColor(Color.parseColor("#00EAE8"));
scalePaint.setAntiAlias(true);
scalePaint.setStrokeWidth(5);
scalePaint.setStyle(Paint.Style.STROKE);
scalePaint.setColor(Color.parseColor("#00EAE8"));
panelTextPaint.setAntiAlias(true);
panelTextPaint.setStyle(Paint.Style.FILL);
panelTextPaint.setColor(Color.parseColor("#00EAE8"));
progressTextPaint.setAntiAlias(true);
progressTextPaint.setStyle(Paint.Style.FILL);
progressTextPaint.setColor(Color.parseColor("#00EAE8"));
progressTextPaint.setTypeface(Typeface.DEFAULT_BOLD);
pointPaint.setAntiAlias(true);
pointPaint.setStyle(Paint.Style.FILL);
pointPaint.setColor(Color.parseColor("#00EAE8"));
leftPointerPaint.setAntiAlias(true);
leftPointerPaint.setStyle(Paint.Style.FILL_AND_STROKE);
leftPointerPaint.setColor(Color.parseColor("#00EAE8"));
rightPointerPaint.setAntiAlias(true);
rightPointerPaint.setColor(Color.parseColor("#00EAE8"));
rightPointerPaint.setStyle(Paint.Style.FILL_AND_STROKE);
pointerCirclePaint.setAntiAlias(true);
pointerCirclePaint.setColor(Color.parseColor("#00EAE8"));
pointerCirclePaint.setStyle(Paint.Style.FILL);
pointerCirclePaint.setDither(true);
}
/**
* 设置当前温度
*/
public void setCurrentTemp(float currentTemp) {
if (currentTemp < 0) {
currentTemp = 0;
} else {
this.currentTemp = currentTemp;
postInvalidate();
}
}
public float getCurrentTemp() {
return currentTemp;
}
}
public class DashBoardViewCenter extends View {
private float progressWidth;
private String tempText;
private float tempTextSize;
private Paint scaleArcPaint; // 刻度弧
private Paint scalePaint; // 刻度
private Paint panelTextPaint; // 表盘文字
private Paint progressTextPaint; // 进度条上的文字
private Paint pointPaint; // 中心圆
private Paint leftPointerPaint; // 表针左半部分
private Paint rightPointerPaint; // 表针右半部分
private Paint pointerCirclePaint; // 表针的圆轴
private Paint paintCircleBg;//画白色的背景
private int mSize; // 最终的大小
private static final int PADDING = 15; // 进度的宽度
private static final int OFFSET = 5;
private String scale; // 刻度数值
private int mTikeCount = 50; // 40条刻度(包括长短)
private int mLongTikeHeight = dp2px(10); // 长刻度
private int mShortTikeHeight = dp2px(5); // 短刻度
private int scaleArcRadius; // 刻度弧的半径
private int pointRadius = dp2px(10); // 中心圆半径
private float currentTemp;
public DashBoardViewCenter(Context context) {
this(context, null);
}
public DashBoardViewCenter(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public DashBoardViewCenter(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// 获取自定义属性
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.temperatureProgress);
progressWidth = ta.getDimension(R.styleable.temperatureProgress_progressWidth, PADDING);
tempText = ta.getString(R.styleable.temperatureProgress_tempText);
tempTextSize = ta.getDimension(R.styleable.temperatureProgress_tempTextSize, sp2px(15));
ta.recycle();
initPaint();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int realWidth = startMeasure(widthMeasureSpec);
int realHeight = startMeasure(heightMeasureSpec);
//因为是以正方形为基础
mSize = Math.min(realHeight, realWidth);
setMeasuredDimension(mSize, mSize);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 将画布移到中央
canvas.translate(mSize / 2, mSize / 2);
canvas.drawCircle(0, 0, mSize / 2, paintCircleBg);
// 画表盘
drawPanel(canvas);
}
/**
* 表盘
*
* @param canvas
*/
private void drawPanel(Canvas canvas) {
// 画刻度弧
drawScaleArc(canvas);
// 画中间圆
drawInPoint(canvas);
// 画指针
drawPointer(canvas);
// 绘制文字
drawPanelText(canvas);
}
/**
* 表盘上的文字
*
* @param canvas
*/
private void drawPanelText(Canvas canvas) {
canvas.save();
String text = "累计里程";
float length = panelTextPaint.measureText(text);
panelTextPaint.setTextSize(sp2px(12));
canvas.drawText(text, -length / 2, scaleArcRadius / 2, panelTextPaint);
String temp = currentTemp + "KM";
panelTextPaint.setTextSize(sp2px(12));
// panelTextPaint.setColor(tempTextColor);
float tempTextLength = panelTextPaint.measureText(temp);
canvas.drawText(temp, -tempTextLength / 2, scaleArcRadius / 2 + dp2px(18), panelTextPaint);
canvas.restore();
}
/**
* 指针(这里分为左右部分是为了画出来的指针有立体感)
*
* @param canvas
*/
private void drawPointer(Canvas canvas) {
RectF rectF = new RectF(-pointRadius / 2, -pointRadius / 2, pointRadius / 2, pointRadius / 2);
canvas.save();
// 先将指针与刻度0位置对齐
canvas.rotate(60, 0, 0);
float angle = currentTemp * 6.0f;
canvas.rotate(angle, 0, 0);
// 表针左半部分
Path leftPointerPath = new Path();
leftPointerPath.moveTo(pointRadius / 2, 0);
leftPointerPath.addArc(rectF, 0, 360);
leftPointerPath.lineTo(0, scaleArcRadius - mLongTikeHeight - dp2px(OFFSET) - dp2px(15));
leftPointerPath.lineTo(-pointRadius / 2, 0);
leftPointerPath.close();
// 表针右半部分
Path rightPointerPath = new Path();
rightPointerPath.moveTo(-pointRadius / 2, 0);
rightPointerPath.addArc(rectF, 0, -180);
rightPointerPath.lineTo(0, scaleArcRadius - mLongTikeHeight - dp2px(OFFSET) - dp2px(15));
rightPointerPath.lineTo(0, pointRadius / 2);
rightPointerPath.close();
// 表针的圆
Path circlePath = new Path();
circlePath.addCircle(0, 0, pointRadius / 4, Path.Direction.CW);
canvas.drawPath(leftPointerPath, leftPointerPaint);
canvas.drawPath(rightPointerPath, rightPointerPaint);
canvas.drawPath(circlePath, pointerCirclePaint);
canvas.restore();
}
/**
* 中心圆
*/
private void drawInPoint(Canvas canvas) {
canvas.save();
canvas.drawCircle(0, 0, pointRadius, pointPaint);
canvas.restore();
}
/**
* 刻度弧
*/
private void drawScaleArc(Canvas canvas) {
// 刻度弧紧靠进度弧
scaleArcRadius = mSize / 2 - dp2px(PADDING) / 4;
canvas.save();
// 画弧
RectF rectF = new RectF(-scaleArcRadius, -scaleArcRadius,
scaleArcRadius, scaleArcRadius);
/*---------------加阴影-------------*/
// this.setLayerType(View.LAYER_TYPE_SOFTWARE, scaleArcPaint);//设置为SOFTWARE才会实现阴影
// scaleArcPaint.setShadowLayer(10F, 5F,5F, Color.parseColor("#00EAE8"));//偏移度很小时则变成发光字体
/*---------------加阴影-------------*/
// canvas.drawArc(rectF, 150, 240, false, scaleArcPaint);
canvas.drawArc(rectF, 140, 260, false, scaleArcPaint);
// 画布回正
canvas.rotate(240, 0, 0);
// 旋转的角度
float mAngle = 240f / mTikeCount;
// 画右半部分的刻度
for (int i = 0; i <= mTikeCount; i++) {
// 5的倍数就画长刻度,并标上刻度数值
if (i % 5 == 0) {
scale = 4 * i + "";
panelTextPaint.setTextSize(sp2px(12));
float scaleWidth = panelTextPaint.measureText(scale);
canvas.drawLine(0, -scaleArcRadius, 0, -scaleArcRadius + mLongTikeHeight, scalePaint);
canvas.drawText(scale, -scaleWidth / 2, -scaleArcRadius + mLongTikeHeight + dp2px(15), panelTextPaint);
} else {
canvas.drawLine(0, -scaleArcRadius, 0, -scaleArcRadius + mShortTikeHeight, scalePaint);
}
canvas.rotate(mAngle, 0, 0);
}
// 画布回正
canvas.restore();
}
/**
* 测量大小
*/
private int startMeasure(int whSpec) {
int result = 0;
int size = MeasureSpec.getSize(whSpec);
int mode = MeasureSpec.getMode(whSpec);
if (mode == MeasureSpec.EXACTLY) {
result = size;
} else {
result = dp2px(220);
}
return result;
}
/**
* 将 dp 转换为 px
*/
private int dp2px(int dp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());
}
private int sp2px(int sp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, getResources().getDisplayMetrics());
}
/**
* 初始化画笔
*/
private void initPaint() {
scaleArcPaint = new Paint();
scalePaint = new Paint();
panelTextPaint = new Paint();
progressTextPaint = new Paint();
pointPaint = new Paint();
leftPointerPaint = new Paint();
rightPointerPaint = new Paint();
pointerCirclePaint = new Paint();
scaleArcPaint.setAntiAlias(true);
scaleArcPaint.setStrokeWidth(dp2px(2));
scaleArcPaint.setStyle(Paint.Style.STROKE);
scaleArcPaint.setColor(Color.parseColor("#00EAE8"));
scalePaint.setAntiAlias(true);
scalePaint.setStrokeWidth(5);
scalePaint.setStyle(Paint.Style.STROKE);
scalePaint.setColor(Color.parseColor("#00EAE8"));
panelTextPaint.setAntiAlias(true);
panelTextPaint.setStyle(Paint.Style.FILL);
panelTextPaint.setColor(Color.parseColor("#00EAE8"));
progressTextPaint.setAntiAlias(true);
progressTextPaint.setStyle(Paint.Style.FILL);
progressTextPaint.setColor(Color.parseColor("#00EAE8"));
progressTextPaint.setTypeface(Typeface.DEFAULT_BOLD);
pointPaint.setAntiAlias(true);
pointPaint.setStyle(Paint.Style.FILL);
pointPaint.setColor(Color.parseColor("#00EAE8"));
leftPointerPaint.setAntiAlias(true);
leftPointerPaint.setStyle(Paint.Style.FILL_AND_STROKE);
leftPointerPaint.setColor(Color.parseColor("#00EAE8"));
rightPointerPaint.setAntiAlias(true);
rightPointerPaint.setColor(Color.parseColor("#00EAE8"));
rightPointerPaint.setStyle(Paint.Style.FILL_AND_STROKE);
pointerCirclePaint.setAntiAlias(true);
pointerCirclePaint.setColor(Color.parseColor("#00EAE8"));
pointerCirclePaint.setStyle(Paint.Style.FILL);
pointerCirclePaint.setDither(true);
paintCircleBg = new Paint();
paintCircleBg.setStyle(Paint.Style.FILL);
paintCircleBg.setColor(Color.BLACK);
}
/**
* 设置当前温度
*/
public void setCurrentTemp(float currentTemp) {
if (currentTemp < 0) {
currentTemp = 0;
} else {
this.currentTemp = currentTemp;
postInvalidate();
}
}
public float getCurrentTemp() {
return currentTemp;
}
public float getProgressWidth() {
return progressWidth;
}
public void setProgressWidth(float progressWidth) {
this.progressWidth = progressWidth;
}
public String getTempText() {
return tempText;
}
public void setTempText(String tempText) {
this.tempText = tempText;
}
public float getTempTextSize() {
return tempTextSize;
}
public void setTempTextSize(float tempTextSize) {
this.tempTextSize = tempTextSize;
}
}
public class DashBoardViewViewRight extends View {
private float progressWidth;
private String tempText;
private float tempTextSize;
private Paint progressPaint; // 进度
private Paint scaleArcPaint; // 刻度弧
private Paint scalePaint; // 刻度
private Paint panelTextPaint; // 表盘文字
private Paint progressTextPaint; // 进度条上的文字
private Paint pointPaint; // 中心圆
private Paint leftPointerPaint; // 表针左半部分
private Paint rightPointerPaint; // 表针右半部分
private Paint pointerCirclePaint; // 表针的圆轴
private int mSize; // 最终的大小
private static final int PADDING = 15; // 进度的宽度
private static final int OFFSET = 5;
private String scale; // 刻度数值
private int mTikeCount = 20; // 40条刻度(包括长短)
private int mLongTikeHeight = dp2px(10); // 长刻度
private int mShortTikeHeight = dp2px(5); // 短刻度
private int scaleArcRadius; // 刻度弧的半径
private int pointRadius = dp2px(10); // 中心圆半径
private float currentTemp;
public DashBoardViewViewRight(Context context) {
this(context, null);
}
public DashBoardViewViewRight(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public DashBoardViewViewRight(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// 获取自定义属性
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.temperatureProgress);
progressWidth = ta.getDimension(R.styleable.temperatureProgress_progressWidth, PADDING);
tempText = ta.getString(R.styleable.temperatureProgress_tempText);
tempTextSize = ta.getDimension(R.styleable.temperatureProgress_tempTextSize, sp2px(15));
ta.recycle();
initPaint();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int realWidth = startMeasure(widthMeasureSpec);
int realHeight = startMeasure(heightMeasureSpec);
/**
* 因为是以正方形为基础
*/
mSize = Math.min(realHeight, realWidth);
setMeasuredDimension(mSize, mSize);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 将画布移到中央
canvas.translate(mSize / 2, mSize / 2);
canvas.save();
canvas.rotate(60);
// 画表盘
drawPanel(canvas);
canvas.restore();
// 绘制文字
drawPanelText(canvas);
}
/**
* 表盘
*/
private void drawPanel(Canvas canvas) {
// 画刻度弧
drawScaleArc(canvas);
// 画中间圆
drawInPoint(canvas);
// 画指针
drawPointer(canvas);
}
/**
* 表盘上的文字
*/
private void drawPanelText(Canvas canvas) {
canvas.save();
String text = "MIN";
float length = panelTextPaint.measureText(text);
panelTextPaint.setTextSize(sp2px(10));
canvas.drawText(text, -length / 2 + dp2px(5), scaleArcRadius / 2 - dp2px(5), panelTextPaint);
// String temp = currentTemp + "KM";
// panelTextPaint.setTextSize(sp2px(12));
panelTextPaint.setColor(tempTextColor);
// float tempTextLength = panelTextPaint.measureText(temp);
// canvas.drawText(temp, -tempTextLength / 2, scaleArcRadius / 2 + dp2px(5), panelTextPaint);
canvas.restore();
}
/**
* 指针(这里分为左右部分是为了画出来的指针有立体感)
*/
private void drawPointer(Canvas canvas) {
RectF rectF = new RectF(-pointRadius / 2, -pointRadius / 2, pointRadius / 2, pointRadius / 2);
canvas.save();
// 先将指针与刻度0位置对齐
canvas.rotate(100, 0, 0);
float angle = currentTemp * 6.0f;
canvas.rotate(angle, 0, 0);
// 表针左半部分
Path leftPointerPath = new Path();
leftPointerPath.moveTo(pointRadius / 2, 0);
leftPointerPath.addArc(rectF, 0, 360);
leftPointerPath.lineTo(0, scaleArcRadius - mLongTikeHeight - dp2px(OFFSET) - dp2px(15));
leftPointerPath.lineTo(-pointRadius / 2, 0);
leftPointerPath.close();
// 表针右半部分
Path rightPointerPath = new Path();
rightPointerPath.moveTo(-pointRadius / 2, 0);
rightPointerPath.addArc(rectF, 0, -180);
rightPointerPath.lineTo(0, scaleArcRadius - mLongTikeHeight - dp2px(OFFSET) - dp2px(15));
rightPointerPath.lineTo(0, pointRadius / 2);
rightPointerPath.close();
// 表针的圆
Path circlePath = new Path();
circlePath.addCircle(0, 0, pointRadius / 4, Path.Direction.CW);
canvas.drawPath(leftPointerPath, leftPointerPaint);
canvas.drawPath(rightPointerPath, rightPointerPaint);
canvas.drawPath(circlePath, pointerCirclePaint);
canvas.restore();
}
/**
* 中心圆
*
* @param canvas
*/
private void drawInPoint(Canvas canvas) {
canvas.save();
canvas.drawCircle(0, 0, pointRadius, pointPaint);
canvas.restore();
}
/**
* 刻度弧
*/
private void drawScaleArc(Canvas canvas) {
// 刻度弧紧靠进度弧
scaleArcRadius = mSize / 2 - dp2px(PADDING) / 4;
canvas.save();
// 画弧
RectF rectF = new RectF(-scaleArcRadius, -scaleArcRadius, scaleArcRadius, scaleArcRadius);
/*---------------加阴影-------------*/
// this.setLayerType(View.LAYER_TYPE_SOFTWARE, scaleArcPaint);//设置为SOFTWARE才会实现阴影
// scaleArcPaint.setShadowLayer(5F, 5F,1F, Color.parseColor("#00EAE8"));//偏移度很小时则变成发光字体
/*---------------加阴影-------------*/
// canvas.drawArc(rectF, 150, 240, false, scaleArcPaint);
canvas.drawArc(rectF, 0, 360, false, scaleArcPaint);
// 画布回正
canvas.rotate(280, 0, 0);
// 旋转的角度
float mAngle = 180f / mTikeCount;
// 画右半部分的刻度
for (int i = 0; i <= mTikeCount; i++) {
// 5的倍数就画长刻度,并标上刻度数值
if (i % 5 == 0) {
scale = 2 * i + "";
panelTextPaint.setTextSize(sp2px(12));
float scaleWidth = panelTextPaint.measureText(scale);
canvas.drawLine(0, -scaleArcRadius, 0, -scaleArcRadius + mLongTikeHeight, scalePaint);
canvas.drawText(scale, -scaleWidth / 2, -scaleArcRadius + mLongTikeHeight + dp2px(12), panelTextPaint);
} else {
canvas.drawLine(0, -scaleArcRadius, 0, -scaleArcRadius + mShortTikeHeight, scalePaint);
}
canvas.rotate(mAngle, 0, 0);
}
// 画布回正
canvas.restore();
}
/**
* 测量大小
*/
private int startMeasure(int whSpec) {
int result = 0;
int size = MeasureSpec.getSize(whSpec);
int mode = MeasureSpec.getMode(whSpec);
if (mode == MeasureSpec.EXACTLY) {
result = size;
} else {
result = dp2px(220);
}
return result;
}
/**
* 将 dp 转换为 px
*/
private int dp2px(int dp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());
}
private int sp2px(int sp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, getResources().getDisplayMetrics());
}
/**
* 初始化画笔
*/
private void initPaint() {
progressPaint = new Paint();
scaleArcPaint = new Paint();
scalePaint = new Paint();
panelTextPaint = new Paint();
progressTextPaint = new Paint();
pointPaint = new Paint();
leftPointerPaint = new Paint();
rightPointerPaint = new Paint();
pointerCirclePaint = new Paint();
progressPaint.setAntiAlias(true);
progressPaint.setStrokeWidth(dp2px(PADDING));
progressPaint.setStyle(Paint.Style.STROKE);
progressPaint.setStrokeCap(Paint.Cap.ROUND);
progressPaint.setStrokeJoin(Paint.Join.ROUND);
scaleArcPaint.setAntiAlias(true);
scaleArcPaint.setStrokeWidth(dp2px(2));
scaleArcPaint.setStyle(Paint.Style.STROKE);
scaleArcPaint.setColor(Color.parseColor("#00EAE8"));
scalePaint.setAntiAlias(true);
scalePaint.setStrokeWidth(5);
scalePaint.setStyle(Paint.Style.STROKE);
scalePaint.setColor(Color.parseColor("#00EAE8"));
panelTextPaint.setAntiAlias(true);
panelTextPaint.setStyle(Paint.Style.FILL);
panelTextPaint.setColor(Color.parseColor("#00EAE8"));
progressTextPaint.setAntiAlias(true);
progressTextPaint.setStyle(Paint.Style.FILL);
progressTextPaint.setColor(Color.parseColor("#00EAE8"));
progressTextPaint.setTypeface(Typeface.DEFAULT_BOLD);
pointPaint.setAntiAlias(true);
pointPaint.setStyle(Paint.Style.FILL);
pointPaint.setColor(Color.parseColor("#00EAE8"));
leftPointerPaint.setAntiAlias(true);
leftPointerPaint.setStyle(Paint.Style.FILL_AND_STROKE);
leftPointerPaint.setColor(Color.parseColor("#00EAE8"));
rightPointerPaint.setAntiAlias(true);
rightPointerPaint.setColor(Color.parseColor("#00EAE8"));
rightPointerPaint.setStyle(Paint.Style.FILL_AND_STROKE);
pointerCirclePaint.setAntiAlias(true);
pointerCirclePaint.setColor(Color.parseColor("#00EAE8"));
pointerCirclePaint.setStyle(Paint.Style.FILL);
pointerCirclePaint.setDither(true);
}
/**
* 设置当前温度
*/
public void setCurrentTemp(float currentTemp) {
if (currentTemp < 0) {
currentTemp = 0;
} else {
this.currentTemp = currentTemp;
postInvalidate();
}
}
public float getCurrentTemp() {
return currentTemp;
}
public float getProgressWidth() {
return progressWidth;
}
public void setProgressWidth(float progressWidth) {
this.progressWidth = progressWidth;
}
public String getTempText() {
return tempText;
}
public void setTempText(String tempText) {
this.tempText = tempText;
}
public float getTempTextSize() {
return tempTextSize;
}
public void setTempTextSize(float tempTextSize) {
this.tempTextSize = tempTextSize;
}
}