美文网首页
自定义控件之仪表盘

自定义控件之仪表盘

作者: shada | 来源:发表于2016-07-17 16:42 被阅读63次

    先看效果

    Paste_Image.png

    完整代码如下
    整个圆弧280,分为7份,每份角度为40°。

    package example.com.dashbarddemo;
    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.text.TextPaint;
    import android.util.AttributeSet;
    import android.view.View;
    public class BoardView extends View {
        private TextPaint textPaint;
        private Paint linePaint;
        private float centerX;
        private float centerY;
        private String[] texts;
        private float radius;
        private Rect rect;
        //大刻度线距离文字的距离
        private float text2line;
        //小刻度线距离文字的距离
        private float text2lineshorter;
        private Paint arcPaint;
        private Paint stripPaint;
        private float angle=0.001f;
        //蓝色弧形的宽度
        private float stripStrokeWidth;
        private Paint mPaint;
        //最外层弧线的宽度
        private float strokWidth;
        private Paint circlePaint;
        private RectF rectF;
        private RectF rectF2;
        private RectF rectF3;
        private RectF rectF4;
        //刻度线宽度
        private float ticksWidth=dp2px(2);
        //刻度线长度
        private float ticksHeight=dp2px(20);
        public float getAngle() {
            return angle;
        }
        public void setAngle(float angle) {
            this.angle = angle;
            invalidate();
        }
        public BoardView(Context context) {
            this(context,null);
        }
        public BoardView(Context context, AttributeSet attrs) {
            this(context, attrs,0);
        }
        public BoardView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            //文字
            textPaint = new TextPaint();
            textPaint.setAntiAlias(true);
            textPaint.setTextSize(20);
            textPaint.setColor(Color.BLACK);
            //刻度线
            linePaint = new Paint();
            linePaint.setAntiAlias(true);
            linePaint.setColor(Color.parseColor("#dedede"));
            linePaint.setStrokeWidth(ticksWidth);
            texts = new String[]{"250","350","450","550","650","750","850","950"};
            //文字的宽高
            rect = new Rect();
            textPaint.getTextBounds(texts[0],0,texts[0].length(), rect);
            text2line = dp2px(10);
            text2lineshorter = dp2px(6);
            //圆环
            arcPaint = new Paint();
            arcPaint.setAntiAlias(true);
            arcPaint.setStyle(Paint.Style.STROKE);
            arcPaint.setStrokeWidth(dp2px(2));
            arcPaint.setColor(Color.BLACK);
            //白条
            stripPaint = new Paint();
            stripPaint.setAntiAlias(true);
            stripPaint.setStyle(Paint.Style.STROKE);
            stripPaint.setColor(Color.WHITE);
            stripStrokeWidth = dp2px(12);
            stripPaint.setStrokeWidth(stripStrokeWidth);
            //最外层圆弧
            mPaint = new Paint();
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setAntiAlias(true);
            mPaint.setColor(Color.parseColor("#7fffffff"));
            strokWidth = dp2px(3);
            mPaint.setStrokeWidth(strokWidth);
            //光点
            circlePaint = new Paint();
            circlePaint.setAntiAlias(true);
            circlePaint.setColor(Color.WHITE);
            circlePaint.setStyle(Paint.Style.FILL_AND_STROKE);
        }
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            //圆心
            centerX = getMeasuredWidth()/2;
            centerY = getMeasuredHeight()/2;
            //半径
            radius = getMeasuredWidth()/2*0.6f;
            rectF = new RectF();
            rectF.left=-radius-dp2px(21);
            rectF.top=-radius-dp2px(21);
            rectF.right=radius+dp2px(21);
            rectF.bottom=radius+dp2px(21);
            rectF2 = new RectF();
            rectF2.left=-radius-dp2px(35);
            rectF2.top=-radius-dp2px(35); 
           rectF2.right=radius+dp2px(35);
           rectF2.bottom=radius+dp2px(35);
            rectF3 = new RectF();
            rectF3.left=-radius-dp2px(22)-stripStrokeWidth/2;
            rectF3.top=-radius-dp2px(22)-stripStrokeWidth/2;
            rectF3.right=radius+dp2px(22)+stripStrokeWidth/2;
            rectF3.bottom=radius+dp2px(22)+stripStrokeWidth/2;
            rectF4 = new RectF();
            rectF4.left=-radius-dp2px(45)-strokWidth/2;
            rectF4.top=-radius-dp2px(45)-strokWidth/2;
            rectF4.right=radius+dp2px(45)+strokWidth/2;
            rectF4.bottom=radius+dp2px(45)+strokWidth/2;
        }
        @Override    protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            canvas.save();
            canvas.translate(centerX,centerY);
            //绘制文字
            for(int i=0;i<texts.length;i++){
                canvas.save();
                canvas.rotate(-140+40*i);
                canvas.drawText(texts[i],0-rect.width()/2,-radius,textPaint);
                canvas.restore();
            }
            //绘制刻度线
            for(int i=0;i<36;i++){
                canvas.save();
                canvas.rotate(-140+i*8);
                if(i%5==0){
                    canvas.drawLine(0,-radius-dp2px(20),0,-radius-dp2px(20)+text2line,linePaint);
                }else{
                    canvas.drawLine(0,-radius-dp2px(20),0,-radius-dp2px(20)+text2lineshorter,linePaint);
                }
                canvas.restore();
            }
            //刻度线所在内圆环
            canvas.drawArc(rectF,130,280,false,arcPaint);
            //刻度线所在外圆环
            canvas.drawArc(rectF2,130,280,false,arcPaint);
            //闭合圆环
            canvas.save();
            canvas.rotate(-140);
            canvas.drawLine(0,-radius-dp2px(20),0,-radius-dp2px(36),arcPaint);
            canvas.rotate(280);
            canvas.drawLine(0,-radius-dp2px(20),0,-radius-dp2px(36),arcPaint);
            canvas.restore();
            //白条
            canvas.drawArc(rectF3,130,angle,false,stripPaint);
            //弧线 
           canvas.drawArc(rectF4,130,angle,false,mPaint);
            //光点
            canvas.save();
            canvas.rotate(angle);
            float distance=radius+dp2px(45)+strokWidth/2;
            canvas.drawCircle((float) (-distance*Math.sin(Math.toRadians(40))),(float)(distance*Math.cos(Math.toRadians(40))),dp2px(3),circlePaint);
            canvas.restore();
            canvas.restore();
        }
        private float dp2px(float dp){
            return getContext().getResources().getDisplayMetrics().density*dp+0.5f;
        }
    }
    

    部分解说
    文字绘制部分

    Paste_Image.png
    //绘制文字
    for(int i=0;i<texts.length;i++){
        canvas.save();
        canvas.rotate(-140+40*i);
        canvas.drawText(texts[i],0-rect.width()/2,-radius,textPaint);
        canvas.restore();
    }
    

    相关文章

      网友评论

          本文标题:自定义控件之仪表盘

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