android自定义view--温度计

package com.sharelink.mytest;

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.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.ImageView;

import java.math.BigDecimal;

/**
 * Created by Administrator on 2017/3/3.
 */
public class Thermometer extends ImageView {

    private Paint mPaint;
    private int height, width, circle_radius;
    private int COLOR_BROWN = Color.parseColor("#A5937B");
    private int COLOR_YELLOW = Color.parseColor("#F7AF1F");
    private int COLOR_GRAY = Color.parseColor("#C1CDCD");
    private int COLOR_TEXT = Color.parseColor("#49BDCC");
    private float temperature = 0f;
    private float temp_temperature = 0f;

    public void setTemperature(float value) {

        Log.e(this.getClass().getSimpleName(), "setTemperature " + value);

        if (value < 0f) {
            value = 0;
        } else if (value > 41.5f) {
            value = 41.5f;
        }

        if (value <= 34f) {
            value = new BigDecimal(value).setScale(0, BigDecimal.ROUND_HALF_UP).floatValue();
        } else {
            value = new BigDecimal(value).setScale(1, BigDecimal.ROUND_HALF_UP).floatValue();
        }
        if (temp_temperature > value) {
            temp_temperature = 0f;
        }
        temperature = value;
        invalidate();
    }

    public Thermometer(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public Thermometer(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        mPaint = new Paint();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        this.height = getMeasuredHeight();
        this.width = getMeasuredWidth();
        circle_radius = width / 4;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        drawBG(canvas);
        drawScale(canvas);
        drawFG(canvas);

        if (temp_temperature < temperature && temp_temperature < 41.5) {
            if (temp_temperature < 34) {
                BigDecimal b1 = new BigDecimal(Float.toString(temp_temperature));
                BigDecimal b2 = new BigDecimal(Float.toString(1f));
                temp_temperature = b1.add(b2).floatValue();
            } else {
                BigDecimal b1 = new BigDecimal(Float.toString(temp_temperature));
                BigDecimal b2 = new BigDecimal(Float.toString(0.1f));
                temp_temperature = b1.add(b2).floatValue();
            }
            invalidate();
        }
        // else if(temp_temperature>temperature && temp_temperature>0){
        // if (temp_temperature < 34) {
        // BigDecimal b1 = new BigDecimal(Float.toString(temp_temperature));
        // BigDecimal b2 = new BigDecimal(Float.toString(1f));
        // temp_temperature = b1.subtract(b2).floatValue();
        // } else {
        // BigDecimal b1 = new BigDecimal(Float.toString(temp_temperature));
        // BigDecimal b2 = new BigDecimal(Float.toString(0.1f));
        // temp_temperature = b1.subtract(b2).floatValue();
        // }
        // invalidate();
        // }
    }

    // private void refresh() {
    // postDelayed(new Runnable() {
    // @Override
    // public void run() {
    // if (temp_temperature < temperature && temp_temperature<41.5) {
    // if (temp_temperature < 34.5) {
    // BigDecimal b1 = new BigDecimal(Float.toString(temp_temperature));
    // BigDecimal b2 = new BigDecimal(Float.toString(0.1f));
    // temp_temperature = b1.add(b2).floatValue();
    // } else {
    // BigDecimal b1 = new BigDecimal(Float.toString(temp_temperature));
    // BigDecimal b2 = new BigDecimal(Float.toString(0.01f));
    // temp_temperature = b1.add(b2).floatValue();
    // }
    // invalidate();
    // refresh();
    // }else if(temp_temperature>temperature && temp_temperature>0){
    // if (temp_temperature < 34.5) {
    // BigDecimal b1 = new BigDecimal(Float.toString(temp_temperature));
    // BigDecimal b2 = new BigDecimal(Float.toString(0.1f));
    // temp_temperature = b1.subtract(b2).floatValue();
    // } else {
    // BigDecimal b1 = new BigDecimal(Float.toString(temp_temperature));
    // BigDecimal b2 = new BigDecimal(Float.toString(0.01f));
    // temp_temperature = b1.subtract(b2).floatValue();
    // }
    // invalidate();
    // refresh();
    // }
    // }
    // }, 50);
    // }

    private void drawScale(Canvas canvas) {
        drawLines(canvas);
        drawText(canvas);
    }

    private void drawText(Canvas canvas) {
        mPaint.reset();
        mPaint.setColor(COLOR_TEXT);
        mPaint.setAntiAlias(true);
        mPaint.setTextSize(60);
        Typeface font = Typeface.create(Typeface.DEFAULT_BOLD, Typeface.BOLD);
        mPaint.setTypeface(font);
        mPaint.setTextAlign(Paint.Align.CENTER);

        Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();
        // 计算文字高度
        float fontHeight = fontMetrics.bottom - fontMetrics.top;

        int line_width = circle_radius * 2 / 3 - 10;
        int text_x = this.width - getPaddingRight() - (circle_radius - 5 + circle_radius) - line_width - line_width / 2
                - 15;

        int begin = 6;//41
        float recH = this.height - getPaddingBottom() - circle_radius - circle_radius + 15 - (getPaddingTop() + 5);

        while (begin >= 0) {  //35

            float addition = 6.5f - begin;
            float addition_h = addition / (41.5f - 34.5f) * recH;

            // 计算文字baseline
            canvas.drawText(String.valueOf(begin*10)+"", text_x, getPaddingTop() + addition_h + fontHeight / 3, mPaint);
            begin--;
        }
    }

    private void drawFG(Canvas canvas) {
        drawYellowArc(canvas, temp_temperature);
        drawYellowRec(canvas, temp_temperature);
        drawRecShadow(canvas);
        drawCircleShadow(canvas);
    }

    private void drawCircleShadow(Canvas canvas) {
        mPaint.reset();
        mPaint.setColor(Color.WHITE);
        mPaint.setAntiAlias(true);
        mPaint.setAlpha(80);

        int radius = (circle_radius - 5) * 2 / 5;

        int circle_x = this.width - getPaddingRight() - circle_radius * 3 / 4;
        int circle_y = this.height - getPaddingBottom() - circle_radius * 5 / 4;

        canvas.drawCircle(circle_x, circle_y, radius, mPaint);
    }

    private void drawRecShadow(Canvas canvas) {
        // mPaint.reset();
        // mPaint.setColor(Color.WHITE);
        // mPaint.setAntiAlias(true);
        // mPaint.setAlpha(50);
        //
        float begin = 41.2f;
        float end = 34.8f;
        float totalH = this.height - getPaddingBottom() - circle_radius - circle_radius + 15 - (getPaddingTop() + 5);
        float recH = totalH * (begin - end) / (41.5f - 34.5f);
        float beginY = getPaddingTop() + (41.5f - begin) / (41.5f - 34.5f) * totalH;
        //
        Rect r2 = new Rect(); // RectF对象
        r2.left = this.width - getPaddingRight() - circle_radius - circle_radius / 3 + 5 + circle_radius / 4; // 左边
        r2.top = (int) beginY; // 上边
        r2.right = this.width - getPaddingRight() - circle_radius + circle_radius / 3 - 5 - circle_radius / 10; // 右边
        r2.bottom = (int) (beginY + recH); // 下边
        // canvas.drawRect(r2, mPaint);

        Drawable d = getResources().getDrawable(R.drawable.recbtn);
        d.setBounds(r2);
        d.draw(canvas);
    }

    private void drawLines(Canvas canvas) {
        mPaint.reset();
        mPaint.setColor(COLOR_GRAY);
        mPaint.setAntiAlias(true);

        int line_width = circle_radius * 2 / 3 - 10;
        int line_x = this.width - getPaddingRight() - (circle_radius - 5 + circle_radius) - line_width;

        float begin = 41.0f;
        float recH = this.height - getPaddingBottom() - circle_radius - circle_radius + 15 - (getPaddingTop() + 5);

        while (begin >= 35) {

            float addition = 41.5f - begin;
            float addition_h = addition / (41.5f - 34.5f) * recH;
            int temp = (int) begin;
            if (begin - temp > 0) {
                canvas.drawLine(line_x + line_width * 3f / 4, getPaddingTop() + addition_h, line_x + line_width,
                        getPaddingTop() + addition_h, mPaint);
            } else {
                canvas.drawLine(line_x, getPaddingTop() + addition_h, line_x + line_width, getPaddingTop() + addition_h,
                        mPaint);
            }

            BigDecimal b1 = new BigDecimal(Float.toString(begin));
            BigDecimal b2 = new BigDecimal(Float.toString(0.1f));
            begin = b1.subtract(b2).floatValue();
        }

    }

    private void drawYellowRec(Canvas canvas, float temperature2) {
        if (temperature2 <= 34)
            return;
        float addition = temperature2 - 34.5f;
        double rate = addition / (41.5d - 34.5d);
        if (rate > 1f) {
            rate = 1f;
        }

        rate = 1 - rate;
        mPaint.reset();
        mPaint.setColor(COLOR_YELLOW);
        mPaint.setAntiAlias(true);
        float recH = this.height - getPaddingBottom() - circle_radius - circle_radius + 15 - (getPaddingTop() + 5);
        RectF r2 = new RectF(); // RectF对象
        r2.left = this.width - getPaddingRight() - circle_radius - circle_radius / 3 + 5; // 左边
        r2.top = (float) (getPaddingTop() + 5 + recH * rate); // 上边
        r2.right = this.width - getPaddingRight() - circle_radius + circle_radius / 3 - 5; // 右边
        r2.bottom = this.height - getPaddingBottom() - circle_radius - 5; // 下边

        if ((float) (getPaddingTop() + 5 + recH * rate) - 30 >= (getPaddingTop() + 5)) {
            canvas.drawRoundRect(r2, 0, 0, mPaint);
            RectF r3 = new RectF(); // RectF对象
            r3.left = this.width - getPaddingRight() - circle_radius - circle_radius / 3 + 5; // 左边
            r3.top = (float) (getPaddingTop() + 5 + recH * rate) - 20; // 上边
            r3.right = this.width - getPaddingRight() - circle_radius + circle_radius / 3 - 5; // 右边
            r3.bottom = (float) (getPaddingTop() + 5 + recH * rate); // 下边
            canvas.drawRoundRect(r3, 0, 0, mPaint);

            mPaint.setColor(COLOR_BROWN);
            RectF r4 = new RectF(); // RectF对象
            r4.left = this.width - getPaddingRight() - circle_radius - circle_radius / 3 + 5; // 左边
            r4.top = (float) (getPaddingTop() + 5 + recH * rate) - 30; // 上边
            r4.right = this.width - getPaddingRight() - circle_radius + circle_radius / 3 - 5; // 右边
            r4.bottom = (float) (getPaddingTop() + 5 + recH * rate); // 下边
            canvas.drawRoundRect(r4, 10, 10, mPaint);
        } else {
            if ((float) (getPaddingTop() + 5 + recH * rate) - 10 >= (getPaddingTop() + 5)) {
                canvas.drawRoundRect(r2, 0, 0, mPaint);
            } else
                canvas.drawRoundRect(r2, 20, 20, mPaint);
        }
    }

    private void drawYellowArc(Canvas canvas, float value) {
        mPaint.reset();
        mPaint.setColor(COLOR_YELLOW);
        mPaint.setAntiAlias(true);

        RectF r2 = new RectF(); // RectF对象
        r2.left = this.width - getPaddingRight() - (circle_radius - 5 + circle_radius); // 左边
        r2.top = this.height - getPaddingBottom() - (circle_radius - 5 + circle_radius); // 上边
        r2.right = this.width - getPaddingRight() - 5; // 右边
        r2.bottom = this.height - getPaddingBottom() - 5;

        if (value <= 34.5f) {
            if (value >= 0) {
                float angle = (value / 34.5f) * 360;
                float start_angle = 90 - angle / 2;
                canvas.drawArc(r2, start_angle, angle, false, mPaint);
            }
        } else {
            canvas.drawArc(r2, -90, 360, false, mPaint);
        }

    }

    private void drawBG(Canvas canvas) {
        drawWhiteCircle(canvas);
        drawWhiteRec(canvas);
        drawBrownCircle(canvas);
        drawBrownRec(canvas);
    }

    private void drawBrownRec(Canvas canvas) {
        mPaint.reset();
        mPaint.setColor(COLOR_BROWN);
        mPaint.setAntiAlias(true);

        RectF r2 = new RectF(); // RectF对象
        r2.left = this.width - getPaddingRight() - circle_radius - circle_radius / 3 + 5; // 左边
        r2.top = getPaddingTop() + 5; // 上边
        r2.right = this.width - getPaddingRight() - circle_radius + circle_radius / 3 - 5; // 右边
        r2.bottom = this.height - getPaddingBottom() - circle_radius - 5; // 下边
        canvas.drawRoundRect(r2, 20, 20, mPaint);
    }

    private void drawBrownCircle(Canvas canvas) {
        mPaint.reset();
        mPaint.setColor(COLOR_BROWN);
        mPaint.setAntiAlias(true);

        int brown_radius = circle_radius - 5;

        int circle_x = this.width - getPaddingRight() - circle_radius;
        int circle_y = this.height - getPaddingBottom() - circle_radius;

        canvas.drawCircle(circle_x, circle_y, brown_radius, mPaint);
    }

    private void drawWhiteRec(Canvas canvas) {
        mPaint.reset();
        mPaint.setColor(Color.WHITE);
        mPaint.setAntiAlias(true);

        RectF r2 = new RectF(); // RectF对象
        r2.left = this.width - getPaddingRight() - circle_radius - circle_radius / 3; // 左边
        r2.top = getPaddingTop(); // 上边
        r2.right = this.width - getPaddingRight() - circle_radius + circle_radius / 3; // 右边
        r2.bottom = this.height - circle_radius; // 下边
        canvas.drawRoundRect(r2, 20, 20, mPaint);
    }

    private void drawWhiteCircle(Canvas canvas) {
        mPaint.reset();
        mPaint.setColor(Color.WHITE);
        mPaint.setAntiAlias(true);

        int circle_x = this.width - getPaddingRight() - circle_radius;
        int circle_y = this.height - getPaddingBottom() - circle_radius;

        canvas.drawCircle(circle_x, circle_y, circle_radius, mPaint);
    }

}

猜你喜欢

转载自blog.csdn.net/wfskxj/article/details/60143490