美文网首页
Android 简易圆形充电进度

Android 简易圆形充电进度

作者: 不会吃鱼的小猫 | 来源:发表于2018-05-11 13:59 被阅读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();
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:Android 简易圆形充电进度

          本文链接:https://www.haomeiwen.com/subject/lusfdftx.html