被废弃的汽车仪表盘

先看效果图
这里写图片描述

本来公司是这么一个需求,但是呢,等我写到一半又改了,改界面这种搬砖的活儿也是够蛋疼的
还是把这个快代码分享一下,但是没有适配,并且进度条的旋转的指针变化也还没写

分成三个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;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值