public class AngleView extends View {
//根据数据显示的圆弧Paint
private Paint mArcPaint,mArcPaintTow,mpointerPaint,mArcPaintthree,levelPaint;
//文字描述的paint
private Paint mTextPaint,mTextPaintTow;
//背景
private Paint paint;
//圆弧开始的角度
private float startAngle=0;
//圆弧背景的开始和结束间的夹角大小
private float mAngle=360;
//当前进度夹角大小
private float mIncludedAngle=0;
//圆弧的画笔的宽度外
private float mStrokeWith=10;
//圆弧的画笔的宽度内
private float mStrokeWithTow=30;
//动画效果的数据及最大/小值
private int mAnimatorValue,mMinValue,mMaxValue;
//中心点的XY坐标
private float centerX,centerY;
public AngleView(Context context) {
this(context,null);
}
public AngleView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
public AngleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//init();
}
private void initPaint() {
//圆弧的paint
mArcPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
//抗锯齿
mArcPaint.setAntiAlias(true);
mArcPaint.setColor(Color.parseColor("#3B3D5C"));
//设置透明度(数值为0-255)
// mArcPaint.setAlpha(100);
//设置画笔的画出的形状
mArcPaint.setStrokeJoin(Paint.Join.ROUND);
mArcPaint.setStrokeCap(Paint.Cap.ROUND);
//设置画笔类型
mArcPaint.setStyle(Paint.Style.STROKE);
mArcPaint.setStrokeWidth(dp2px(mStrokeWith));
//圆弧的paint
mArcPaintTow=new Paint(Paint.ANTI_ALIAS_FLAG);
//抗锯齿
mArcPaintTow.setAntiAlias(true);
mArcPaintTow.setColor(Color.parseColor("#FFF203"));
//设置透明度(数值为0-255)
// mArcPaintTow.setAlpha(100);
//设置画笔的画出的形状
mArcPaintTow.setStrokeJoin(Paint.Join.ROUND);
mArcPaintTow.setStrokeCap(Paint.Cap.ROUND);
//设置画笔类型
mArcPaintTow.setStyle(Paint.Style.STROKE);
mArcPaintTow.setStrokeWidth(dp2px(mStrokeWithTow));
//圆弧的paint
mArcPaintthree=new Paint(Paint.ANTI_ALIAS_FLAG);
//抗锯齿
mArcPaintthree.setAntiAlias(true);
mArcPaintthree.setColor(Color.parseColor("#0A1030"));
//设置透明度(数值为0-255)
// mArcPaintthree.setAlpha(100);
//设置画笔的画出的形状
mArcPaintthree.setStrokeJoin(Paint.Join.ROUND);
mArcPaintthree.setStrokeCap(Paint.Cap.ROUND);
//设置画笔类型
mArcPaintthree.setStyle(Paint.Style.STROKE);
mArcPaintthree.setStrokeWidth(dp2px(mStrokeWithTow));
//指针的paint
mpointerPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
//抗锯齿
mpointerPaint.setAntiAlias(true);
mpointerPaint.setColor(Color.parseColor("#E3E4EA"));
//设置透明度(数值为0-255)
// mpointerPaint.setAlpha(100);
//设置画笔的画出的形状
mpointerPaint.setStrokeJoin(Paint.Join.ROUND);
mpointerPaint.setStrokeCap(Paint.Cap.ROUND);
//设置画笔类型
mpointerPaint.setStyle(Paint.Style.STROKE);
mpointerPaint.setStrokeWidth(dp2px(10));
//说水平paint
levelPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
//抗锯齿
levelPaint.setAntiAlias(true);
levelPaint.setColor(Color.parseColor("#F3F9FC"));
//设置透明度(数值为0-255)
// levelPaint.setAlpha(100);
//设置画笔的画出的形状
levelPaint.setStrokeJoin(Paint.Join.ROUND);
levelPaint.setStrokeCap(Paint.Cap.ROUND);
//设置画笔类型
levelPaint.setStyle(Paint.Style.STROKE);
levelPaint.setStrokeWidth(dp2px(0.5f));
paint=new Paint(Paint.ANTI_ALIAS_FLAG);
//抗锯齿
paint.setAntiAlias(true);
paint.setColor(Color.parseColor("#181C3A"));
//设置透明度(数值为0-255)
// levelPaint.setAlpha(100);
//设置画笔的画出的形状
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);
//设置画笔类型
paint.setStyle(Paint.Style.FILL);
paint.setStrokeWidth(dp2px(0.5f));
//中心文字的paint
mTextPaint=new Paint();
mTextPaint.setAntiAlias(true);
mTextPaint.setColor(Color.parseColor("#FFFFFF"));
//设置文本的对齐方式
mTextPaint.setStrokeWidth(70);
mTextPaint.setTextAlign(Paint.Align.CENTER);
mTextPaint.setTextSize(dp2px(40));
//提示文字的paint
mTextPaintTow=new Paint();
mTextPaintTow.setAntiAlias(true);
mTextPaintTow.setColor(Color.parseColor("#FFF203"));
//设置文本的对齐方式
mTextPaintTow.setStrokeWidth(50);
mTextPaintTow.setTextAlign(Paint.Align.CENTER);
//mTextPaint.setTextSize(getResources().getDimensionPixelSize(R.dimen.dp_12));
mTextPaintTow.setTextSize(dp2px(23));
}
@SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
centerX=getWidth()/2;
centerY=getHeight()/2;
//初始化paint
initPaint();
//绘制弧度
drawArc(canvas);
//绘制文本
drawText(canvas);
}
/**
* 绘制文本
* @param canvas
*/
private void drawText(Canvas canvas) {
Rect mRect=new Rect();
String mValue= String.valueOf(mIncludedAngle);
//绘制中心的数值
mTextPaint.getTextBounds(mValue,0,mValue.length(),mRect);
// 设定阴影(柔边, X 轴位移, Y 轴位移, 阴影颜色)
mTextPaint.setShadowLayer(15, 3, 3, 0xFFFF00FF);
// paint.setShadowLayer(90, 3, 4,Color.parseColor("#181C3A"));
// canvas.drawCircle(getWidth() / 2, getHeight() / 2, 90, paint);
float x = (getWidth()/2);
canvas.drawText(String.valueOf(Math.round(mIncludedAngle))+"°",x,getHeight()/2+50,mTextPaint);
if (mIncludedAngle==-90||mIncludedAngle==90){
canvas.drawText("竖立",x,(getHeight()/2)-120,mTextPaintTow);
}else {
if (mIncludedAngle==0){
mTextPaintTow.setColor(Color.parseColor("#FFFFFF"));
canvas.drawText("水平",x,(getHeight()/2)-120,mTextPaintTow);
}else if (mIncludedAngle>0){
mTextPaintTow.setColor(Color.parseColor("#FFF203"));
canvas.drawText("右倾",x,(getHeight()/2)-120,mTextPaintTow);
}else {
mTextPaintTow.setColor(Color.parseColor("#FFF203"));
canvas.drawText("左倾",x,(getHeight()/2)-120,mTextPaintTow);
}
}
}
/**
* 绘制当前的圆弧
* @param canvas
*/
private void drawArc(Canvas canvas) {
//绘制圆弧背景
float x = (getWidth() - getHeight() / 2) / 2;
float y = getHeight() / 4;
RectF mRectF = new RectF( x, y,
getWidth() - x, getHeight() - y);
canvas.drawArc(mRectF,startAngle,mAngle,false,mArcPaint);
//绘制当前数值对应的圆弧
mArcPaint.setColor(Color.parseColor("#FF4A40"));
//根据当前数据绘制对应的圆弧
RectF mRectF1 = new RectF(x+80, y+80,getWidth() - x-80, getHeight() - y-80);
canvas.drawArc(mRectF1,startAngle,mAngle,false,mArcPaintthree);
canvas.drawArc(mRectF1,startAngle,mIncludedAngle,false,mArcPaintTow);
canvas.drawLine(x,getHeight()/2,x+40,getHeight()/2,mpointerPaint);//画线刻度
canvas.drawLine(getWidth()-40-x,getHeight()/2,
getWidth()-x,getHeight()/2,mpointerPaint);//画线刻度
canvas.drawLine(getWidth()/2,getHeight()/4,getWidth()/2,getHeight()/4+40,mpointerPaint);//画线刻度
canvas.drawLine(getWidth()/2,getHeight() - y,getWidth()/2,getHeight() - y-40,mpointerPaint);//画线刻度
canvas.drawLine(0,getHeight()/2,getWidth(),getHeight()/2,levelPaint);//水平线
canvas.save();//先保存之前的
canvas.rotate(mIncludedAngle,getWidth()/2, getHeight()/2);//延中心点旋转角度
canvas.drawLine(x,getHeight()/2,getWidth()-10-x,getHeight()/2,mpointerPaint);//画线
canvas.restore();//恢复
}
/**
* 设置数据
* @param minValue 最小值
* @param maxValue 最大值
* @param currentValue 当前绘制的值
*/
public void setValues(int minValue,int maxValue, int currentValue) {
mMaxValue=maxValue;
mMinValue=minValue;
//完全覆盖
mIncludedAngle=currentValue;
invalidate();
}
public float dp2px(float dp) {
DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
return dp * metrics.density;
}
}
可以自己稍做修改,调整 如果
不明白可以+1546079149QQ张哥
public class AngleView1 extends View {
//根据数据显示的圆弧Paint
private Paint mArcPaint,mArcPaintTow,mpointerPaint,mpointerPaintTow,mArcPaintthree,levelPaint,MaxArc;
//文字描述的paint
private Paint mTextPaint,mTextPaintTow;
//圆弧开始的角度
private float startAngle=180;
//圆弧背景的开始和结束间的夹角大小
private float mAngle=90;
//当前进度夹角大小
private float mIncludedAngle=0;
//圆弧的画笔的宽度外
private float mStrokeWith=15;
//圆弧的画笔的宽度内
private float mStrokeWithTow=15;
//动画效果的数据及最大/小值
private int mAnimatorValue,mMinValue,mMaxValue;
//中心点的XY坐标
private float centerX,centerY;
public AngleView1(Context context) {
this(context,null);
}
public AngleView1(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
public AngleView1(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//init();
}
private void initPaint() {
//圆弧的paint
mArcPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
//抗锯齿
mArcPaint.setAntiAlias(true);
mArcPaint.setColor(Color.parseColor("#0A1030"));
//设置透明度(数值为0-255)
//设置画笔的画出的形状
mArcPaint.setStrokeJoin(Paint.Join.ROUND);
mArcPaint.setStrokeCap(Paint.Cap.ROUND);
//设置画笔类型
mArcPaint.setStyle(Paint.Style.STROKE);
mArcPaint.setStrokeWidth(dp2px(mStrokeWith));
//圆弧的paint
MaxArc=new Paint(Paint.ANTI_ALIAS_FLAG);
//抗锯齿
MaxArc.setAntiAlias(true);
MaxArc.setColor(Color.parseColor("#AFB9EF"));
//设置透明度(数值为0-255)
//设置画笔的画出的形状
MaxArc.setStrokeJoin(Paint.Join.ROUND);
MaxArc.setStrokeCap(Paint.Cap.ROUND);
//设置画笔类型
MaxArc.setStyle(Paint.Style.FILL);
MaxArc.setStrokeWidth(dp2px(mStrokeWith));
MaxArc.setTextAlign(Paint.Align.CENTER);
MaxArc.setAlpha(100);
//圆弧的paint
mArcPaintTow=new Paint(Paint.ANTI_ALIAS_FLAG);
//抗锯齿
mArcPaintTow.setAntiAlias(true);
mArcPaintTow.setColor(Color.parseColor("#FFF203"));
//设置透明度(数值为0-255)
//设置画笔的画出的形状
mArcPaintTow.setStrokeJoin(Paint.Join.ROUND);
mArcPaintTow.setStrokeCap(Paint.Cap.ROUND);
//设置画笔类型
mArcPaintTow.setStyle(Paint.Style.STROKE);
mArcPaintTow.setStrokeWidth(dp2px(40));
//圆弧的paint
mArcPaintthree=new Paint(Paint.ANTI_ALIAS_FLAG);
//抗锯齿
mArcPaintthree.setAntiAlias(true);
mArcPaintthree.setColor(Color.parseColor("#1953FF"));
//设置透明度(数值为0-255)
//设置画笔的画出的形状
mArcPaintthree.setStrokeJoin(Paint.Join.ROUND);
mArcPaintthree.setStrokeCap(Paint.Cap.ROUND);
//设置画笔类型
mArcPaintthree.setStyle(Paint.Style.STROKE);
mArcPaintthree.setStrokeWidth(dp2px(mStrokeWithTow));
//指针的paint
mpointerPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
//抗锯齿
mpointerPaint.setAntiAlias(true);
mpointerPaint.setColor(Color.parseColor("#F3F9FC"));
//设置透明度(数值为0-255)
//设置画笔的画出的形状
mpointerPaint.setStrokeJoin(Paint.Join.ROUND);
mpointerPaint.setStrokeCap(Paint.Cap.ROUND);
//设置画笔类型
mpointerPaint.setStyle(Paint.Style.STROKE);
mpointerPaint.setStrokeWidth(dp2px(10));
//指针的paint
mpointerPaintTow=new Paint(Paint.ANTI_ALIAS_FLAG);
//抗锯齿
mpointerPaintTow.setAntiAlias(true);
mpointerPaintTow.setColor(Color.parseColor("#F3F9FC"));
//设置透明度(数值为0-255)
//设置画笔的画出的形状
mpointerPaintTow.setStrokeJoin(Paint.Join.ROUND);
mpointerPaintTow.setStrokeCap(Paint.Cap.ROUND);
//设置画笔类型
mpointerPaintTow.setStyle(Paint.Style.STROKE);
mpointerPaintTow.setStrokeWidth(dp2px(1));
//说水平paint
levelPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
//抗锯齿
levelPaint.setAntiAlias(true);
levelPaint.setColor(Color.parseColor("#F3F9FC"));
//设置透明度(数值为0-255)
//设置画笔的画出的形状
levelPaint.setStrokeJoin(Paint.Join.ROUND);
levelPaint.setStrokeCap(Paint.Cap.ROUND);
//设置画笔类型
levelPaint.setStyle(Paint.Style.STROKE);
levelPaint.setStrokeWidth(dp2px(1.5f));
//中心文字的paint
mTextPaint=new Paint();
mTextPaint.setAntiAlias(true);
mTextPaint.setColor(Color.parseColor("#FFFFFF"));
//设置文本的对齐方式
mTextPaint.setStrokeWidth(70);
mTextPaint.setTextAlign(Paint.Align.CENTER);
mTextPaint.setTextSize(dp2px(20));
//提示文字的paint
mTextPaintTow=new Paint();
mTextPaintTow.setAntiAlias(true);
mTextPaintTow.setColor(Color.parseColor("#FFF203"));
//设置文本的对齐方式
mTextPaintTow.setStrokeWidth(50);
mTextPaintTow.setTextAlign(Paint.Align.CENTER);
//mTextPaint.setTextSize(getResources().getDimensionPixelSize(R.dimen.dp_12));
mTextPaintTow.setTextSize(dp2px(23));
}
@SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
centerX=getWidth()/2;
centerY=getHeight()/2;
//初始化paint
initPaint();
//绘制弧度
drawArc(canvas);
//绘制文本
drawText(canvas);
}
/**
* 绘制文本
* @param canvas
*/
private void drawText(Canvas canvas) {
}
/**
* 绘制当前的圆弧
* @param canvas
*/
private void drawArc(Canvas canvas) {
//绘制圆弧背景
float x = 400;
float y =200;
RectF mRectF = new RectF(x,x,(getWidth()*2)-x,(getWidth()*2)-x);
canvas.drawArc(mRectF,startAngle,mAngle,false,mArcPaint);
//绘制当前数值对应的圆弧
mArcPaint.setColor(Color.parseColor("#FF4A40"));
//根据当前数据绘制对应的圆弧
RectF mRectF1 = new RectF(600, 600,(getWidth()*2)-600, (getWidth()*2)-600);
RectF mRectF2 = new RectF(200, 200,(getWidth()*2)-200, (getWidth()*2)-200);
canvas.drawArc(mRectF,startAngle,mIncludedAngle,false,mArcPaintthree);
canvas.drawArc(mRectF1,startAngle,mIncludedAngle,false,mArcPaintTow);
canvas.drawArc(mRectF2,startAngle,mIncludedAngle,true,MaxArc);
canvas.drawLine(0,(((getWidth()*2+x)-x)/2),getWidth(),(((getWidth()*2+x)-x)/2),levelPaint);//水平线
canvas.save();//先保存之前的
canvas.rotate(mIncludedAngle,(((getWidth()*2+x)-x)/2), (((getWidth()*2+x)-x)/2));//延中心点旋转角度
canvas.drawLine(x,(((getWidth()*2+x)-x)/2),getWidth(),(((getWidth()*2+x)-x)/2),mpointerPaint);//画线
canvas.drawLine(50,(((getWidth()*2+x)-x)/2),getWidth(),(((getWidth()*2+x)-x)/2),mpointerPaintTow);//画线
Rect mRect=new Rect();
String mValue= String.valueOf(mIncludedAngle);
//绘制中心的数值
mTextPaint.getTextBounds(mValue,0,mValue.length(),mRect);
if (mIncludedAngle<84.0f){
canvas.drawText(String.valueOf(mIncludedAngle)+"°",200,(((getWidth()*2+x)-x)/2-50),mTextPaint);
}else {
canvas.drawText(String.valueOf(mIncludedAngle)+"°",200,(((getWidth()*2+x)-x)/2+180),mTextPaint);
}
if (mIncludedAngle==0){
mTextPaintTow.setColor(Color.parseColor("#FFFFFF"));
canvas.drawText("水平",y,(((getWidth()*2+x)-x)/2+100),mTextPaintTow);
}else if (mIncludedAngle>0){
mTextPaintTow.setColor(Color.parseColor("#FFF203"));
canvas.drawText("仰角",y,(((getWidth()*2+x)-x)/2+100),mTextPaintTow);
}else {
mTextPaintTow.setColor(Color.parseColor("#FFF203"));
canvas.drawText("仰角",y,(((getWidth()*2+x)-x)/2+100),mTextPaintTow);
}
canvas.restore();//恢复
}
/**
* 设置数据
* @param minValue 最小值
* @param maxValue 最大值
* @param currentValue 当前绘制的值
*/
public void setValues(int minValue,int maxValue, int currentValue) {
mMaxValue=maxValue;
mMinValue=minValue;
//完全覆盖
mIncludedAngle=currentValue;
invalidate();
}
public float dp2px(float dp) {
DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
return dp * metrics.density;
}
}
1740

被折叠的 条评论
为什么被折叠?



