Android 开发自定义角度进度

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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想不上班

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值