Android 简易圆形充电进度

2018-05-11  本文已影响0人  不会吃鱼的小猫

由于项目需要 简单绘制一个圆形的充电进度

图片

WeChatSight342.gif
package com.yunzao.dd.support.widget;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.Rect;
import android.graphics.RectF;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.util.AttributeSet;
import android.view.View;

import com.ike.l2_base.utils.DUtils;
import com.yunzao.dd.R;
import com.yunzao.dd.utils.LogUtil;

/**
 * @auth ike
 * @date 2018/5/9
 * @desc 类描述:充电中VIew
 */

public class ChargingView extends View {
    private static final String TAG = "ChargingView";

    private Context mContext;
    private Canvas mCanvas;
    //view宽高
    private int view_width = 0;
    private int view_height = 0;
    //圆环到view的间距
    private int padding = 240;
    //角标宽度
    private int angleFlag_width = 24;
    private int angleFlag_textSize = 12;//角标文字大小
    private int angleFlag_textPadding = 60;
    //圆环半径
    private int radius = 0;
    //圆环宽度
    private int round_width = 24;
    //圆心坐标
    private int centerX = 0;
    private int centerY = 0;
    private PaintFlagsDrawFilter filter;

    //画笔
    private Paint paint;


    //文字的宽度
    private int textWidth = 0;
    //文字图片
    private Bitmap textBitmap;

    //进度 最大值100
    private int mProgress = 50;


    public ChargingView(Context context) {
        super(context);
        mContext = context;
        init();
    }

    public ChargingView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        init();
    }

    /**
     * 初始化
     */
    private void init() {
        paint = new Paint();
        paint.setAntiAlias(true);
        filter = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);

        angleFlag_textSize = DUtils.sp2px(mContext, angleFlag_textSize);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        view_width = right - left;
        view_height = bottom - top;
        radius = (view_width - padding) / 2;
        centerX = view_width / 2;
        centerY = view_height / 2;
        textWidth = (view_width - padding) / 2 - 200;
        LogUtil.info(TAG, "width:" + view_width + "/height:" + view_height);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mCanvas = canvas;
        //从canvas层面抗锯齿
        canvas.setDrawFilter(filter);

        //1.绘制白色背景圆环
        paint.reset();
        paint.setColor(ContextCompat.getColor(mContext, R.color.text_white));
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(round_width);
        canvas.drawCircle(centerX, centerY, radius, paint);

        //2.画开始点的角标
        paint.reset();
        paint.setColor(ContextCompat.getColor(mContext, R.color.text_white));
        paint.setStyle(Paint.Style.FILL);
        canvas.drawRect((view_width - angleFlag_width) / 2, padding / 2 - angleFlag_width - round_width / 2, (view_width - angleFlag_width) / 2 + angleFlag_width, padding / 2, paint);

        //3.画00文字
        drawAngleFlagText(canvas, mProgress);

        //4.画圆弧进度
        drawProgress(canvas, mProgress);
    }

    /**
     * 绘制进度
     *
     * @param canvas
     * @param progress
     */
    private void drawProgress(Canvas canvas, int progress) {
        int angle = 3600 / 100 * progress / 10;
        LogUtil.info(TAG, "进度:" + progress + "、角度:" + angle);
        /**
         * 画圆弧 ,画圆环的进度
         */
        paint.reset();
        paint.setColor(ContextCompat.getColor(mContext, R.color.green));
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(round_width);

        //设置进度是实心还是空心
        paint.setStrokeWidth(round_width); //设置圆环的宽度
        RectF oval = new RectF(centerX - radius, centerX - radius, centerX
                + radius, centerX + radius);  //用于定义的圆弧的形状和大小的界限
        canvas.drawArc(oval, 270, angle, false, paint);  //根据进度画圆弧

        //每到12.5画一次角标
//        for (float i = 0; i < progress; i += 0.5) {
//            if ((i * 10) % 125 == 0) {
//                drawAngleFlag(canvas, (int) (i * 10));
//            }
//        }
        //绘制文字图片 并保存canvas
        drawBitmapText(canvas, progress);
        canvas.save();

        //绘制角标
        drawAngleFlag(canvas, angle);

    }

    /**
     * 绘制进度角标 绿色
     *
     * @param angle
     */
    private void drawAngleFlag(Canvas canvas, int angle) {
        LogUtil.info(TAG, "绘制角标:" + angle);
        paint.reset();
        paint.setColor(ContextCompat.getColor(mContext, R.color.green));
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(round_width);

        //设置进度是实心还是空心
        paint.setStrokeWidth(round_width); //设置圆环的宽度

        RectF oval = new RectF(
                centerX - radius - angleFlag_width,
                centerX - radius - angleFlag_width,
                centerX + radius + angleFlag_width,
                centerX + radius + angleFlag_width);  //用于定义的圆弧的形状和大小的界限
//        canvas.drawArc(oval, 270, angle, false, paint);  //根据进度画圆弧

        for (int i = 0; i <= angle / 45; i++) {
            canvas.drawLine(centerX,
                    centerY - radius + round_width / 2,
                    centerX,
                    centerY - radius - angleFlag_width - 12, paint);
            canvas.rotate(45, centerX, centerY);
        }
    }

    /**
     * 绘制角标文字
     *
     * @param canvas
     */
    private void drawAngleFlagText(Canvas canvas, int progress) {
        //3.画四个角文字
        paint.reset();
        paint.setTextSize(angleFlag_textSize);
        paint.setColor(ContextCompat.getColor(mContext, R.color.text_black));
        //上
        canvas.drawText("00",
                view_width / 2 - getTextWidth("00", paint) / 2,
                padding / 2 - angleFlag_textPadding,
                paint);
        if (progress >= 25) {
            //右
            canvas.drawText("25",
                    view_width - getTextWidth("25", paint) - (padding / 2 - getTextWidth("25", paint) - angleFlag_textPadding),
                    centerY + getTextHeight("50", paint) / 3,
                    paint);
        }
        if (progress >= 50) {
            //下
            canvas.drawText("50",
                    view_width / 2 - getTextWidth("50", paint) / 2,
                    view_height - (padding / 2 - angleFlag_textPadding - getTextHeight("50", paint) + round_width / 2),
                    paint);
        }
        if (progress >= 75) {
            //左
            canvas.drawText("75",
                    padding / 2 - angleFlag_textPadding - getTextWidth("50", paint),
                    centerY + getTextHeight("50", paint) / 3,
                    paint);
        }


    }

    /**
     * 绘制图片文字
     *
     * @param canvas
     * @param progress
     */
    private void drawBitmapText(Canvas canvas, int progress) {
        paint.reset();
        int StartX = (view_width - textWidth) / 2;
//        paint.setColor(ContextCompat.getColor(mContext, R.color.text_red));
//        paint.setStyle(Paint.Style.STROKE);
//        paint.setStrokeWidth(round_width);
//        canvas.drawLine(StartX, view_height / 2, StartX + 5, view_height / 2, paint);
        Bitmap[] bitmaps = createBitmap(progress);
        for (int i = 1; i <= bitmaps.length; i++) {
            LogUtil.info(TAG, "文字 X : " + StartX + ((textWidth / bitmaps.length) * (i - 1)));
            int temp = (textWidth - (bitmaps[i - 1].getWidth() * bitmaps.length)) / 2;
            canvas.drawBitmap(bitmaps[i - 1], StartX + ((textWidth / bitmaps.length) * (i - 1)) + temp, view_height / 2 - bitmaps[i - 1].getHeight() / 2, paint);

        }
    }

    /**
     * 创建图标drawable
     */
    private Bitmap[] createBitmap(int mProgress) {
        Bitmap[] bitmaps = new Bitmap[("" + mProgress).length()];
        String text = mProgress + "";
        for (int i = 0; i < text.length(); i++) {
            int temp = Integer.parseInt(text.charAt(i) + "");
//            LogUtil.info(TAG, "temp:" + text.charAt(i));
            textBitmap = BitmapFactory.decodeResource(mContext.getResources(), getDrawableId(temp));
            int oldSize = textBitmap.getHeight();
            int newSize = textWidth / text.length();
            float scale = newSize * 1.0f / oldSize;
            Matrix matrix = new Matrix();
            matrix.setScale(scale, scale);
            bitmaps[i] = textBitmap;
        }
        return bitmaps;
    }

    /**
     * 获取图片ID
     *
     * @param flag
     * @return
     */
    private int getDrawableId(int flag) {
        int drawableId = 0;
        switch (flag) {
            case 0:
                drawableId = R.drawable.icon_0;
                break;
            case 1:
                drawableId = R.drawable.icon_1;
                break;
            case 2:
                drawableId = R.drawable.icon_2;
                break;
            case 3:
                drawableId = R.drawable.icon_3;
                break;
            case 4:
                drawableId = R.drawable.icon_4;
                break;
            case 5:
                drawableId = R.drawable.icon_5;
                break;
            case 6:
                drawableId = R.drawable.icon_6;
                break;
            case 7:
                drawableId = R.drawable.icon_7;
                break;
            case 8:
                drawableId = R.drawable.icon_8;
                break;
            case 9:
                drawableId = R.drawable.icon_9;
                break;
        }
        return drawableId;
    }

    /**
     * 计算文字宽度
     */
    private int getTextWidth(String textString, Paint mPaint) {
        Rect bounds = new Rect();
        mPaint.getTextBounds(textString, 0, textString.length(), bounds);
        return bounds.right - bounds.left;
    }

    //计算文字高度
    private int getTextHeight(String textString, Paint mPaint) {
        // 1.用FontMetrics对象计算高度
        Paint.FontMetricsInt fontMetrics = mPaint.getFontMetricsInt();
        return fontMetrics.bottom - fontMetrics.top;
    }

    /**
     * 绘制进度
     *
     * @param progress
     */
    public void setProgress(int progress) {
        if (progress > 100)
            progress = 100;
        mProgress = progress;
        postInvalidate();
    }

}

上一篇下一篇

猜你喜欢

热点阅读