美文网首页
Android自定义蛛网图(雷达图)

Android自定义蛛网图(雷达图)

作者: dlihasa | 来源:发表于2018-11-14 00:44 被阅读45次
    前言

    纸上得来终觉浅,绝知此事要躬行。

    直接上代码
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Path;
    import android.support.annotation.Nullable;
    import android.util.AttributeSet;
    import android.view.View;
    
    public class SpiderView extends View{
    
        private Paint radarPaint,valuePaint;
        private float radius;
        private int centerX;
        private int centerY;
        private int count = 6;
        private int maxValue = 6;
        double[] data = {2,5,1,6,4,5};
        private int a = 360/6;
    
        public SpiderView(Context context) {
            super(context);
            init();
        }
    
        public SpiderView(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
            init();
        }
    
        public SpiderView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init();
        }
    
        private void init() {
            radarPaint = new Paint();
            radarPaint.setStyle(Paint.Style.STROKE);
            radarPaint.setColor(Color.GREEN);
    
            valuePaint = new Paint();
            valuePaint.setStyle(Paint.Style.FILL);
            valuePaint.setColor(Color.BLUE);
        }
    
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            radius = Math.min(w,h)/2*0.9f;
            centerX = w/2;
            centerY = h/2;
            postInvalidate();
            super.onSizeChanged(w, h, oldw, oldh);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            drawPolygon(canvas);
            drawLine(canvas);
            drawRegion(canvas);
        }
    
    //画数据区域
        private void drawRegion(Canvas canvas) {
            Path path = new Path();
            valuePaint.setAlpha(127);
            for(int i=0;i<count;i++){
                double percent = data[i]/maxValue;
                float x = (float)(centerX + radius * percent * Math.cos(Math.toRadians(a)*i));
                float y = (float)(centerY + radius * percent * Math.sin(Math.toRadians(a)*i));
                if(i==0){
                    path.moveTo(x,y);
                }else{
                    path.lineTo(x,y);
                }
                canvas.drawCircle(x,y,10,valuePaint);
            }
            valuePaint.setStyle(Paint.Style.FILL_AND_STROKE);
            canvas.drawPath(path,valuePaint);
        }
    
    //画角线
        private void drawLine(Canvas canvas) {
            Path path = new Path();
            for(int i=0;i<count;i++){
                path.reset();
                path.moveTo(centerX,centerY);
                float x = (float)(centerX + radius * Math.cos(Math.toRadians(a)*i));
                float y = (float)(centerY + radius * Math.sin(Math.toRadians(a)*i));
                path.lineTo(x,y);
                canvas.drawPath(path,radarPaint);
            }
        }
    
    //画网格框
        private void drawPolygon(Canvas canvas) {
            Path path = new Path();
            float r = radius/count;
            for(int i=1;i<=count;i++){
                float curR = r * i;
                path.reset();
                for(int j=0;j<count;j++){
                    if(j==0){
                        path.moveTo(centerX + curR, centerY);
                    }else{
                        float x = (float)(centerX + curR * Math.cos(Math.toRadians(a)*j));
                        float y = (float)(centerY + curR*Math.sin(Math.toRadians(a)*j));
                        path.lineTo(x,y);
                    }
                }
               // path.close();
                canvas.drawPath(path,radarPaint);
            }
        }
    }
    

    效果图如下:


    缺了一个口.jpg
    • 本来就没有完美的事情,索性就让它缺一个口吧,代码中注释的那句就是解决的方案。
    遇到的问题
    • 三角函数的问题,里面一定要用弧度弧度弧度,Math.cos(Math.toRadians(a)i)和Math.sin(Math.toRadians(a)i),关于弧度还是角度看这里

    相关文章

      网友评论

          本文标题:Android自定义蛛网图(雷达图)

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