Android 雷达图 MPAndroidChart 框架实现、

MPAndroidChart 框架实现、

https://blog.csdn.net/tyyj90/article/details/48230247


自己写的

public class RadarView extends View {
    private int count = 6;                //数据个数
    private float angle = (float) (Math.PI*2/count);
    private float radius;                   //网格最大半径
    private int centerX;                  //中心X
    private int centerY;                  //中心Y
    private String[] titles = {"a","b","c","d","e","f"};  //各维度标签
    //    private double[] data = {3,3,3,3,3,3}; //各维度分值
    private ArrayList<Float> data = new ArrayList<Float>();  //各维度值
    private float maxValue = 5;             //数据最大值
    private Paint mainPaint;                //雷达区画笔
    private Paint innerValuePaint;               //数据区画笔
    private Paint textPaint;                //文本画笔
    private Paint outerValuePaint;                //雷达区边框画笔
    private float circleRadius = 2;                //圆点半径
    private int lableCount = 6;                //Y轴值个数
    private int innerAlpha = 166;                //蜘蛛网局部透明度
    private float strokeWidth = 2;                //蜘蛛网边框宽度
    private boolean drawLabels = false;                //绘制轴值
    private boolean showValueText = false;                //是否显示轴上的值
    private float circleZero =(float) Math.PI/2;    ;                //初始角度为90度


    public void setCircleRadius(float circleRadius) {
        this.circleRadius = circleRadius;
    }


    public RadarView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

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

    public RadarView(Context context) {
        super(context);
        init();
    }


    //初始化
    private void init() {
        count = titles.length;

        mainPaint = new Paint();
        mainPaint.setAntiAlias(true);
        mainPaint.setColor(Color.GRAY);
        mainPaint.setStyle(Paint.Style.STROKE);

        innerValuePaint = new Paint();
        innerValuePaint.setAntiAlias(true);
        innerValuePaint.setColor(Color.BLUE);
        innerValuePaint.setStyle(Paint.Style.FILL);
        outerValuePaint = new Paint();
        outerValuePaint.setAntiAlias(true);
        outerValuePaint.setColor(Color.BLUE);
        outerValuePaint.setStyle(Paint.Style.STROKE);

        textPaint = new Paint();
        textPaint.setTextSize(100);
        textPaint.setStyle(Paint.Style.FILL);
        textPaint.setColor(Color.BLACK);
        textPaint.setAntiAlias(true);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        radius = Math.min(h, w)/2*0.8f;
        centerX = w/2;
        centerY = h/2;
        postInvalidate();
        super.onSizeChanged(w, h, oldw, oldh);
    }



    @Override
    protected void onDraw(Canvas canvas) {
        drawPolygon(canvas);
        drawLines(canvas);
        drawText(canvas);
        drawRegion(canvas);
    }

    /**
     * 绘制正多边形
     */
    private void drawPolygon(Canvas canvas){
        Path path = new Path();
        float r = radius/(lableCount-1);
        for(int i=1;i<lableCount;i++){
            float curR = r*i;
            path.reset();
            for(int j=0;j<count;j++){
                if(j==0){
                    path.moveTo(centerX,centerY-curR);
                    if(drawLabels){
                        String text =String.valueOf(Float.valueOf((maxValue/(lableCount-1))*i));
                        float dis = textPaint.measureText(text);//文本长度
                        canvas.drawText(text,centerX,centerY-curR,textPaint);
                    }
                }else{
                    float x = (float) (centerX+curR*Math.cos(angle*j-circleZero));
                    float y = (float) (centerY+curR*Math.sin(angle*j-circleZero));
                    path.lineTo(x,y);
                }
            }
            path.close();
            canvas.drawPath(path, mainPaint);
        }
    }

    /**
     * 绘制直线
     */
    private void drawLines(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(angle*i-circleZero));
            float y = (float) (centerY+radius*Math.sin(angle*i-circleZero));
            path.lineTo(x, y);
            canvas.drawPath(path, mainPaint);
        }
    }
    /**
     * 绘制文字
     * @param canvas
     */
    private void drawText(Canvas canvas){
        Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();
        float fontHeight = fontMetrics.descent - fontMetrics.ascent;
        for(int i=0;i<count;i++){
            float x = (float) (centerX+(radius+fontHeight/2)*Math.cos(angle*i-circleZero));
            float y = (float) (centerY+(radius+fontHeight/2)*Math.sin(angle*i-circleZero));
            float dis = textPaint.measureText(titles[i]);//文本长度
            if(i < count/2 &&  i > 0 ){//第12象限
                canvas.drawText(titles[i], x,y,textPaint);
            }else if(i > count/2){//第34象限
                canvas.drawText(titles[i], x-dis,y,textPaint);
            }else if(i == 0){
                canvas.drawText(titles[i], x-dis/2,y,textPaint);
            }else if(i == count/2){
                canvas.drawText(titles[i], x-dis/2,y+15,textPaint);
            }
        }
    }

    /**
     * 绘制区域
     * @param canvas
     */
    private void drawRegion(Canvas canvas){
        Path path = new Path();
        innerValuePaint.setAlpha(255);
        float x0 = centerX,y0 = centerY;
        for(int i=0;i<count;i++){
            double percent = data.get(i)/maxValue;
            float x = (float) (centerX+radius*Math.cos(angle*i-circleZero)*percent);
            float y = (float) (centerY+radius*Math.sin(angle*i-circleZero)*percent);
            if(i==0){
                path.moveTo(centerX, y);
                x0 = x;
                y0 = y;
            }else {
                path.lineTo(x,y);
            }
            if(i == count-1){
                path.lineTo(x0,y0);
            }
            //绘制小圆点
            canvas.drawCircle(x,y,circleRadius,outerValuePaint);
            if(showValueText){
                float dis = textPaint.measureText(String.valueOf(data.get(i)));//文本长度
                if(i < count/2 &&  i > 0 ){//第12象限
                    canvas.drawText(String.valueOf(data.get(i)), x,y,textPaint);
                }else if(i > count/2){//第34象限
                    canvas.drawText(String.valueOf(data.get(i)), x-dis,y,textPaint);
                }else if(i == 0){
                    canvas.drawText(String.valueOf(data.get(i)), x-dis/2,y,textPaint);
                }else if(i == count/2){
                    canvas.drawText(String.valueOf(data.get(i)), x-dis/2,y+15,textPaint);
                }
            }
        }
        innerValuePaint.setAlpha(innerAlpha);
        canvas.drawPath(path, innerValuePaint);
        //绘制填充区域
        outerValuePaint.setAlpha(255);
        outerValuePaint.setStrokeWidth(strokeWidth);
        canvas.drawPath(path, outerValuePaint);
    }

    //设置标题
    public void setTitles(String[] titles) {
        this.titles = titles;
    }

    //设置数值
    public void setData(ArrayList<Float> data) {
        this.data = data;
    }


    public float getMaxValue() {
        return maxValue;
    }

    //设置最大数值
    public void setMaxValue(float maxValue) {
        this.maxValue = maxValue;
    }

    //设置蜘蛛网颜色
    public void setMainPaintColor(int color){
        mainPaint.setColor(color);
    }
    //设置蜘蛛网透明度
    public void setMainPaintAlpha(int alpha){
        mainPaint.setAlpha(alpha);
    }
    //设置蜘蛛网区域内透明度
    public void setValuePaintAlpha(int alpha){
        innerValuePaint.setAlpha(alpha);
    }

    //设置标题颜色
    public void setTextPaintColor(int color){
        textPaint.setColor(color);
    }

    //设置覆盖局域颜色
    public void setValuePaintColor(int color){
        innerValuePaint.setColor(color);
        outerValuePaint.setColor(color);
    }

    //设置字体大小
    public void setTextPaintTextSize(float size){
        textPaint.setTextSize(size);
    }

    public void setLableCount(int lableCount) {
        this.lableCount = lableCount;
    }

    public void setInnerAlpha(int innerAlpha) {
        this.innerAlpha = innerAlpha;
    }

    public void setStrokeWidth(float strokeWidth) {
        this.strokeWidth = strokeWidth;
    }

    public void setDrawLabels(boolean drawLabels) {
        this.drawLabels = drawLabels;
    }

    public void setShowValueText(boolean showValueText) {
        this.showValueText = showValueText;
    }

}

猜你喜欢

转载自blog.csdn.net/qq_40446718/article/details/80969854