Android初学之自定义简单蛛网(雷达)图

Android-SpiderPlotView蛛网图 SpiderPlotView蛛网图 立即下载

因项目需要,需要加入蛛网图的显示,虽然GitHub上早已有很多大神的nb框架,但是还是想自己写写练练手。
项目中显示的蛛网图也比较简单,只需要控制四个进度值,这样就不需要考虑角度旋转的问题了 ,只需要控制上下左右四个进度值得变化就可以了,也就是只取上下左右四个进度值的点就可以了。
首先先获取各个重要点位信息:

@Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        //初始化各边信息  获取各方向位置点起始位置信息
        left = leftRightPadding;
        top = topBottomPadding;
        right = w - leftRightPadding;
        bottom = h - topBottomPadding;
        if (centerPoint == null) {
            centerPoint = new PointF();
        }
        centerPoint.x = w / 2;
        centerPoint.y = h / 2;
        progressSpaceX = (centerPoint.x - left)/4;
        progressSpaceY = (centerPoint.y - top)/4;
        if (shader == null) {
            //初始化渐变色背景
            shader = new LinearGradient(centerPoint.x,top,centerPoint.x,bottom,Color.parseColor("#18C2B1"),
                    Color.parseColor("#FDA23E"), Shader.TileMode.MIRROR);
        }
        setProgressValue();
    }

然后实现蛛网图的刻度效果,主要代码

 		//画横竖两条背景线
        path.moveTo(left,centerPoint.y);
        path.lineTo(right,centerPoint.y);
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(Color.parseColor("#cccccc"));
        paint.setStrokeWidth(3);
        canvas.drawPath(path,paint);
        path.reset();
        path.moveTo(centerPoint.x,top);
        path.lineTo(centerPoint.x,bottom);
        canvas.drawPath(path,paint);
        //画蛛网线
        paint.setShader(shader);
        paint.setStrokeWidth(3);
        for (int i = 0; i < 4; i++) {
            path.reset();
            path.moveTo(left + progressSpaceX * i,centerPoint.y);
            path.lineTo(centerPoint.x,top + progressSpaceY * i);
            path.lineTo(right -  progressSpaceX * i,centerPoint.y);
            path.lineTo(centerPoint.x,bottom - progressSpaceY * i);
            path.lineTo(left + progressSpaceX * i,centerPoint.y);
            canvas.drawPath(path,paint);
            paint.setStrokeWidth(2);
        }

在这里插入图片描述

然后画个进度标题(示例代码写死,实际应用可自定义标题):

 		//画标题
        paint.setShader(null);
        paint.setColor(textColor);
        paint.setStyle(Paint.Style.FILL);
        paint.setTextSize(textSize);
        paint.setTextAlign(Paint.Align.CENTER);
        paint.getTextBounds("节能",0,2,rect);
        //计算文字高度  左右标题居中显示
        float de = rect.height();
        canvas.drawText("节能",centerPoint.x, topBottomPadding /2,paint);
        canvas.drawText("灾害",centerPoint.x,bottom + topBottomPadding /2,paint);
        canvas.drawText("卫生",leftRightPadding / 2,centerPoint.y + de/2,paint);
        canvas.drawText("效能",leftRightPadding / 2 + right,centerPoint.y + de/2,paint);

在这里插入图片描述

之后画进度值:

		//画四个方向进度圆点
        paint.setColor(Color.parseColor("#00BDAA"));
        paint.setStyle(Paint.Style.FILL);
        canvas.drawCircle(topPoint.x,topPoint.y,pointCircleRadius,paint);
        canvas.drawCircle(leftPoint.x,leftPoint.y,pointCircleRadius,paint);
        canvas.drawCircle(rightPoint.x,rightPoint.y,pointCircleRadius,paint);
        canvas.drawCircle(bottomPoint.x,bottomPoint.y,pointCircleRadius,paint);
        //画四个方向进度区域
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(5);
        path.reset();
        path.moveTo(leftPoint.x,leftPoint.y);
        path.lineTo(topPoint.x,topPoint.y);
        path.lineTo(rightPoint.x,rightPoint.y);
        path.lineTo(bottomPoint.x,bottomPoint.y);
        path.lineTo(leftPoint.x,leftPoint.y);
        canvas.drawPath(path,paint);
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.parseColor("#b355C7C2"));
        canvas.drawPath(path,paint);

在这里插入图片描述

最后加上动态效果:

 /**
     * 启动动画
     * @param topProgress 上方进度值
     * @param rightProgress 右方进度值
     * @param bottomProgress 底部进度值
     * @param leftProgress 左方进度值
     */
    private void startAnimator(final double topProgress,final double rightProgress,final double bottomProgress, final double leftProgress){
        ValueAnimator topAnimator = ValueAnimator.ofInt(0, 100);
        topAnimator.setDuration(2000);
        topAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                Integer v = (Integer) animation.getAnimatedValue();
                DayHealthProgressView.this.topProgress = v * topProgress/100 ;
                DayHealthProgressView.this.rightProgress = v* rightProgress/100 ;
                DayHealthProgressView.this.bottomProgress = v* bottomProgress/100 ;
                DayHealthProgressView.this.leftProgress = v* leftProgress/100 ;
                setProgressValue();
                invalidate();
            }
        });
        topAnimator.start();
    }

最终效果如下:
在这里插入图片描述

完整代码:

package com.zc.tt;

import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.Shader;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

import com.blankj.utilcode.util.ConvertUtils;

/**
 * 自定义每日健康蛛网图
 * @author zc
 */
public class DayHealthProgressView extends View {
    /**画笔*/
    private Paint paint;
    private Path path;
    private Rect rect;
    /**
     * 控制四个点信息,中心点、上方进度值点、下方进度值点、左方进度值点、右方进度值点
     */
    private PointF centerPoint,topPoint, bottomPoint,leftPoint,rightPoint;
    /**蛛网图各方向起始位置*/
    private float left,right,top,bottom;
    /**上下间距*/
    private float topBottomPadding;
    /**左右间距*/
    private float leftRightPadding;
    /**左右进度值单位长度、上下进度值单位长度*/
    private float progressSpaceX,progressSpaceY;
    /**背景shader*/
    private LinearGradient shader;
    /**字体大小*/
    private float textSize;
    /**字体颜色*/
    private int textColor;
    /**上方进度值*/
    private double topProgress;
    /**下方进度值*/
    private double bottomProgress;
    /**左方进度值*/
    private double leftProgress;
    /**右方进度值*/
    private double rightProgress;
    /**中心店圆的Radius*/
    private float pointCircleRadius;
    public DayHealthProgressView(Context context) {
        super(context);
        init();
    }

    public DayHealthProgressView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        //初始化各边信息  获取各方向位置点起始位置信息
        left = leftRightPadding;
        top = topBottomPadding;
        right = w - leftRightPadding;
        bottom = h - topBottomPadding;
        if (centerPoint == null) {
            centerPoint = new PointF();
        }
        centerPoint.x = w / 2;
        centerPoint.y = h / 2;
        progressSpaceX = (centerPoint.x - left)/4;
        progressSpaceY = (centerPoint.y - top)/4;
        if (shader == null) {
            //初始化渐变色背景
            shader = new LinearGradient(centerPoint.x,top,centerPoint.x,bottom,Color.parseColor("#18C2B1"),
                    Color.parseColor("#FDA23E"), Shader.TileMode.MIRROR);
        }
        setProgressValue();
    }

    /**
     * 初始化
     */
    private void init(){
        if (topPoint == null) {
            topPoint = new PointF();
        }
        if (leftPoint == null) {
            leftPoint = new PointF();
        }
        if (bottomPoint == null) {
            bottomPoint = new PointF();
        }
        if (rightPoint == null) {
            rightPoint = new PointF();
        }
        if (centerPoint == null) {
            centerPoint = new PointF();
        }
        paint = new Paint();
        path = new Path();
        paint.setAntiAlias(true);
        //上下间距和左右间距不一样  左右间距过小会导致文字信息显示不全
        topBottomPadding = ConvertUtils.dp2px(30);
        leftRightPadding = ConvertUtils.dp2px(36);
        textSize = ConvertUtils.sp2px(16);
        textColor = Color.parseColor("#333333");
        rect = new Rect();
        pointCircleRadius = ConvertUtils.dp2px(3);
    }

    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);
        //画横竖两条线
        path.moveTo(left,centerPoint.y);
        path.lineTo(right,centerPoint.y);
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(Color.parseColor("#cccccc"));
        paint.setStrokeWidth(3);
        canvas.drawPath(path,paint);
        path.reset();
        path.moveTo(centerPoint.x,top);
        path.lineTo(centerPoint.x,bottom);
        canvas.drawPath(path,paint);
        //画蛛网线
        paint.setShader(shader);
        paint.setStrokeWidth(3);
        for (int i = 0; i < 4; i++) {
            path.reset();
            path.moveTo(left + progressSpaceX * i,centerPoint.y);
            path.lineTo(centerPoint.x,top + progressSpaceY * i);
            path.lineTo(right -  progressSpaceX * i,centerPoint.y);
            path.lineTo(centerPoint.x,bottom - progressSpaceY * i);
            path.lineTo(left + progressSpaceX * i,centerPoint.y);
            canvas.drawPath(path,paint);
            paint.setStrokeWidth(2);
        }
        //画标题
        paint.setShader(null);
        paint.setColor(textColor);
        paint.setStyle(Paint.Style.FILL);
        paint.setTextSize(textSize);
        paint.setTextAlign(Paint.Align.CENTER);
        paint.getTextBounds("节能",0,2,rect);
        //计算文字高度  左右标题居中显示
        float de = rect.height();
        canvas.drawText("节能",centerPoint.x, topBottomPadding /2,paint);
        canvas.drawText("灾害",centerPoint.x,bottom + topBottomPadding /2,paint);
        canvas.drawText("卫生",leftRightPadding / 2,centerPoint.y + de/2,paint);
        canvas.drawText("效能",leftRightPadding / 2 + right,centerPoint.y + de/2,paint);
        //画四个方向进度圆点
        paint.setColor(Color.parseColor("#00BDAA"));
        paint.setStyle(Paint.Style.FILL);
        canvas.drawCircle(topPoint.x,topPoint.y,pointCircleRadius,paint);
        canvas.drawCircle(leftPoint.x,leftPoint.y,pointCircleRadius,paint);
        canvas.drawCircle(rightPoint.x,rightPoint.y,pointCircleRadius,paint);
        canvas.drawCircle(bottomPoint.x,bottomPoint.y,pointCircleRadius,paint);
        //画四个方向进度区域
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(5);
        path.reset();
        path.moveTo(leftPoint.x,leftPoint.y);
        path.lineTo(topPoint.x,topPoint.y);
        path.lineTo(rightPoint.x,rightPoint.y);
        path.lineTo(bottomPoint.x,bottomPoint.y);
        path.lineTo(leftPoint.x,leftPoint.y);
        canvas.drawPath(path,paint);
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.parseColor("#b355C7C2"));
        canvas.drawPath(path,paint);
    }

    /**
     * 确定进度圆点值
     */
    private void setProgressValue() {
        if (topPoint == null) {
            topPoint = new PointF();
        }
        if (leftPoint == null) {
            leftPoint = new PointF();
        }
        if (bottomPoint == null) {
            bottomPoint = new PointF();
        }
        if (rightPoint == null) {
            rightPoint = new PointF();
        }
        topPoint.y = (float) (((centerPoint.y - top) * (100 - topProgress)) / 100 + top);
        topPoint.x = centerPoint.x;
        bottomPoint.y = (float) ((bottomProgress * (centerPoint.y - topBottomPadding))/100 + centerPoint.y);
        bottomPoint.x = centerPoint.x;
        leftPoint.x = (float) (((centerPoint.x - left) * (100 - leftProgress)) / 100 + left);
        leftPoint.y = centerPoint.y;
        rightPoint.x = (float) ((rightProgress * (centerPoint.x - leftRightPadding))/100 + centerPoint.x);
        rightPoint.y = centerPoint.y;
    }
    public void setProgress(double topProgress,double rightProgress,double bottomProgress,double leftProgress){
        startAnimator(topProgress,rightProgress,bottomProgress,leftProgress);
    }

    /**
     * 启动动画
     * @param topProgress 上方进度值
     * @param rightProgress 右方进度值
     * @param bottomProgress 底部进度值
     * @param leftProgress 左方进度值
     */
    private void startAnimator(final double topProgress,final double rightProgress,final double bottomProgress, final double leftProgress){
        ValueAnimator topAnimator = ValueAnimator.ofInt(0, 100);
        topAnimator.setDuration(2000);
        topAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                Integer v = (Integer) animation.getAnimatedValue();
                DayHealthProgressView.this.topProgress = v * topProgress/100 ;
                DayHealthProgressView.this.rightProgress = v* rightProgress/100 ;
                DayHealthProgressView.this.bottomProgress = v* bottomProgress/100 ;
                DayHealthProgressView.this.leftProgress = v* leftProgress/100 ;
                setProgressValue();
                invalidate();
            }
        });
        topAnimator.start();
    }
    public double getTopProgress() {
        return topProgress;
    }

    public void setTopProgress(double topProgress) {
        this.topProgress = topProgress;
        setProgressValue();
        invalidate();
    }

    public double getBottomProgress() {
        return bottomProgress;
    }

    public void setBottomProgress(double bottomProgress) {
        this.bottomProgress = bottomProgress;
        setProgressValue();
        invalidate();
    }

    public double getLeftProgress() {
        return leftProgress;
    }

    public void setLeftProgress(double leftProgress) {
        this.leftProgress = leftProgress;
        setProgressValue();
        invalidate();
    }

    public double getRightProgress() {
        return rightProgress;
    }

    public void setRightProgress(double rightProgress) {
        this.rightProgress = rightProgress;
        setProgressValue();
        invalidate();
    }

    public float getPointCircleRadius() {
        return pointCircleRadius;
    }

    public void setPointCircleRadius(float pointCircleRadius) {
        this.pointCircleRadius = pointCircleRadius;
        invalidate();
    }
}

Android雷达图(蜘蛛网图)源码 需要在res/values/attrs.xml中添加以下 <declare-styleable name="MyNetPic"> <attr name="lineColor" format="color"/><!-- 线的颜色 --> <attr name="cotentColor" format="color"/><!-- 图形的颜色 --> <attr name="side" format="dimension"/> <!-- 三角形边长 --> <attr name="distance" format="dimens 立即下载

相关推荐

Ripple是一个类似雷达搜索引擎,波纹很好看

Ripple是一个类似雷达搜索引擎,波纹效果很好看,从studio改来的,eclipse亲测可以用。水波会慢慢泛开,可以自己设置波纹条数量,范围和颜色.下载可用。

android 自定义view: 蛛网/雷达图(三)

本系列自定义View全部采用ktmac4.1.31.5.0本篇效果:蛛网图其实就是由多个多边形来组成蛛网的,那么先来画1个多边形来练练手。

高级开发者进阶ing... QaQ 1465

iOS-Charts开源图表库使用(安卓MPAndroidChart的移植)

比较的成熟图表类第三方库,包括折线图,饼状图,雷达图等,可以修改源码,满足项目需要。

Android自定义View之蜘蛛网雷达效果

/ 今日科技快讯 /近日,在将聊天机器人Bard作为主要用于搜索的AI服务推出后,谷歌似乎正在偏离初衷,没有提供任何具体的用例。在最近举行的全体员工会议上,该公司高管辩称,Bard不仅仅用于搜索,他们正探索构建一种协作式AI服务。/ 作者简介 /本篇文章转自史大拿的博客,文章主要分享了自定义View中蛛网的效果,相信会对大家有所帮助!原文地址:https://juejin.cn/p...

郭霖 950

Android RadarView雷达图(蜘蛛网图)的实现代码

公司产品需要一个雷达图来展示各维度的比重,网上找了一波,学到不少,直接自己上手来撸一记 无图言虚空 简单分析一波,确定雷达图正几边形的–正五边形 int count=5,分为几个层数–4 层 int layerCount=4 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); drawPolygon(canvas);//画边 drawLines(canvas);//画线 drawText(canvas);//描绘文字 drawRegion(canvas);//覆盖区域 } 主

手把手教你:如何为自制的STM32H7飞控板适配PX4固件(基于NuttX)

本文详细介绍了如何为自制的STM32H7飞控板适配PX4固件,基于NuttX系统进行移植。从硬件设计规范到软件环境配置,再到PX4固件的移植与调试,提供了完整的实战指南。特别分享了如何复用FMU-v6u参考设计以节省开发时间,并解决了常见问题,帮助开发者快速实现高性能飞控系统的搭建。

weixin_27697385的博客 475

Android雷达图(蜘蛛网图)绘制

简介最近因为项目需求,要实现一款雷达图来表示用户的各种成就值 雷达图的绘制很简单,只要思路清晰按部就班的绘制就可以了,其中使用得最多,是路径path类的使用,使用这个类可以让我们更加方便地绘制出正多边形等效果。 效果图如下: 使用方式使用方式很简单,只要在布局文件里面,直接使用这个控件就好了,记得给它设置一个合适的具体的大小。 另外可以控制绘制的是多少边形,通过提供的一些public方法,可

crazychen的专栏 3万+

Vivado XDMA仿真实战:从配置到链路训练全解析

本文深入解析了Vivado中XDMA IP核的仿真实战流程,重点剖析了PCIe链路训练状态机(LTSSM)的工作原理与调试方法。通过搭建仿真环境、解读日志与波形,手把手指导如何从配置、链路训练(LTSSM)到BAR映射与DMA启动进行全流程分析与问题定位,帮助工程师掌握核心调试技能,确保PCIe链路稳定与数据传输正确。

weixin_29197051的博客 154

android 动态背景_Android 实现动态背景“五彩蛛网”特效,让你大开眼界

本文由 文淑 授权投稿作者公众号:「控件人生」01前言《都挺好》迎来了大结局,相信看哭了很多人。在大结局中,所有之前让人气的牙痒痒的人设,比如 “你们太让我失望” 的苏明哲,还有妈宝男苏明成,包括一天不作就难受的苏大强,最终都成功洗白。一家人最终化解恩怨,和和气气的过日子。还有谁也喜欢《都挺好》这部剧吗?在剧中,苏明哲同我们一样也是一名程序员,一味地迁就老爹,搞得最后差点与老婆离婚,看来...

weixin_31321361的博客 1021

Unity序列帧动画输出全攻略:Recorder+Timeline实战与透明通道处理

序列帧动画是游戏开发、影视动画和UI动效中的基础技术,指将连续动作分解为一系列静态图像并按序播放,形成动态视觉效果。其原理是通过时间轴精确控制每一帧的内容与时机,实现动画的逐帧呈现。在实时渲染领域,序列帧输出技术价值显著,它能够将动态内容高质量地转换为静态图像序列,便于跨平台复用、后期合成与资源分发。应用场景广泛,包括角色动画导出、技能特效制作、宣传片素材生成等。本文聚焦Unity引擎,深入解析如何利用Recorder与Timeline工具链,高效输出带Alpha透明通道的PNG序列帧,并重点攻克透明通道处

weixin_31556767的博客 327

汉字跨越三千年的生命力与数字时代适应性

文字作为文明载体,其演变规律始终遵循实用性与适应性的平衡。汉字作为现存最古老的文字系统,凭借形义结合的六书构造原理,实现了超方言的文化统一功能。在计算机处理方面,五笔输入法与Unicode支持证明了其技术兼容性,而视觉识别效率的先天优势使其在信息时代更具传播效力。从甲骨文识别AI到现代书法设计,汉字系统持续展现强大的文化承载力与技术适应性,这种活态传承为数字人文研究提供了独特样本。

weixin_29058331的博客 355

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

这次自定义实现雷达图,它可以用在分析某些内容所占的比例,比较直观地突出某些数据,比如可以用在游戏玩家的各项能力的分析上,那么它的各项指标就比较明显地看出来了。效果图如下: 看完这幅图大家就清楚要实现的内容吧。下面来实现它。一、思路1、先画背景的正六边形。(1)可以看到每一部分三角形都是相同的,那么我们可以先画其中一部分的三角形,剩下的就重复操作就行了。 就是上面红色的三角形部分(画的有的

LHavoc的博客 5323

OpenAI Codex 国内安装配置全攻略:从零到实战的 AI 编程助手集成指南

AI 编程助手正成为提升开发效率的关键工具,其核心原理是基于大规模语言模型对代码语义进行深度理解与生成。这类技术通过将自然语言指令转化为可执行的代码、自动化重构与调试,为开发者提供了智能化的结对编程体验,其技术价值在于显著降低编码复杂度、加速项目迭代。在实际应用场景中,AI 编程助手可集成于日常开发流,辅助完成代码生成、项目分析与自动化任务。本文聚焦于 OpenAI 的 Codex,针对国内开发者在网络、认证和配置上的常见挑战,提供了涵盖多种安装方式、详细配置步骤及核心使用技巧的实战指南,并特别介绍了如何利

weixin_28715081的博客 415

Android自定义View 多边形能力分析控件,雷达图(蛛网)动态实现

自定义View实现雷达图还是挺简单的,它能让使用让使用者能一目了然的了解各项指标的变动情形以及好坏趋势。使用得最多的便是Path路径,很适合初学者用来练习。 效果图如下: 下面是实体类的属性: public class RadarMapData { private int count;//数值项数 private String [] titles;//...

tg_0804的博客 2587

【车辆动力学】专栏目录汇总

车辆动力学知识目录汇总

CrazyRabbit的博客 1714

win11一直弹出用户账户控制怎么解决

用户帐户控制简称UAC,是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制。近期有部分Win11用户想要关闭UAC,但是不知道应该如何操作,对此下面我就教给大家操作方法,大家可以去尝试看看。...

xitongzhijia_abc的博客 5万+

星辰小队针对于软件“星遇”的10天冲刺——第4天

日期:2019.5.8 博客期:072 星期三   今天参考了很多关于雷达的博客,其实并没有找到能够真正解决实际问题、符合我们要制作的软件的内容。所以,我在博客里整理一下我看到的东西好了:   1、标题:MPAndroidChart_RadarChart雷达图的那些事     网址URL:https://blog.youkuaiyun.com/petterp/article/details/901...

weixin_30337251的博客 136

博途PLC模糊PID控制(量化因子和比例因子)

参数"量化因子和比例因子",都是为了对清晰值进行比例变换而设置的,其作用是使变量按一定比例进行放大或缩小,以便和我们的模糊论域相匹配完成一一映射。这种变换对整个系统的工作性能也是有影响的。(其实相当于额外引入了比例作用,所以说模糊PID的调节是个系统工程)。限于本人能力,文中难免出现错误和不足,欢迎大家批评和指正。博途PLC的模糊PID控制完整算法可以参看下面这篇文章博途PLC模糊PID控制详解(SCL完整源代码+参数)_RXXW_Dor的博客-优快云博客。......

RXXW_Dor的博客 5270

【Android】自定义蜘蛛网图

步骤 步骤一:新建一个类继承自view 步骤二:重写onDraw()函数,需要绘制网格图,中位线以及数据的填充方法 简单思路:onDraw函数中,我们写了三个新的函数,分别用来绘制网格,中位线和数据 ,需要的用到三只画笔,可以自定义有几个方面,比如语数英政史地等六门课程的蜘蛛图,也可以是九门,以及最大值,应该有个统一的最大值,比如说都是150分满分,然后将你所有的成绩输入,绘制一个蜘蛛图。 实现 ...

weixin_43927892的博客 670

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Android蜘蛛网图/雷达图

直接上图 上一篇博客里本来想记录些基础知识,后来图画出来了,想想就算了,直接把东西贴出来,各位自己去看。 东西很简单的。 先定义继承View的类,以及实现类public class SpiderView extends View { public SpiderView(Context context) { super(context); init()

程序猿的玻璃心的专栏 1024

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Android 雷达图(蜘蛛网状图)

先看效果 上代码package com.example.hj.myapplication; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Pat...

WULILL的博客 1905

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

前言纸上得来终觉浅,绝知此事要躬行。直接上代码import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.support.ann...

weixin_39939661的博客 320

Android 八角图 蛛网图 自定义多边形

自定义view  初始化画笔paint mainPaint = new Paint(); mainPaint.setAntiAlias(true); mainPaint.setColor(Color.rgb(136,136,136)); mainPaint.setStyle(Paint.Style.FILL); 实现两个重写方法onSizeChanged(),onDraw() onSi

zhangxunxyy的博客 864

手动撸个Android雷达图(蜘蛛网图)RadarView

公司产品需要一个雷达图来展示各维度的比重,网上找了一波,学到不少,直接自己上手来撸一记 无图言虚空 简单分析一波,确定雷达图正几边形的--正五边形 int count=5,分为几个层数--4 层 int layerCount=4 @Override protected void onDraw(Canvas canvas) { super.onDraw(canva...

weixin_33755554的博客 335

android 自定义蜘蛛网状图形

话不都说,先上图 如图所示,玩lol的玩家都知道,战力分析图,那么怎么实现呢? 具体思路是,1.首先话六边形,用Path进行每个点的链接 2.画连接线,中心点跟最外层六边形各个顶点 3.画数据图,用path进行连接数据,然后paint采用填充模式即可 4.写文...

no_loafer的博客 630

android 自定义五边形图片,Android自定义View-蜘蛛网属性图(五边形图)

首先看看效果图:这里写图片描述先简要说一下这里需要涉及到的知识点:高中基本的三角函数 Sin,Cos。参考的文章:这里为了尊重上面这篇文章的作者,需要说明一下,下面的代码有部分是参考上面这篇文章的。这里我学习之后有了自己的理解。做了一点小改动,然后以自己的思路来捋一捋。希望我的文字对你更有帮助,哈哈。 (Pentagon --五边形)绘制思路:计算三个五边形的五个顶点的坐标,用 path 连接起...

weixin_34245171的博客 571
上一篇: Android错误之使用MPAndroid画曲线图自定MarkerView出现的问题
下一篇: Android初学之封装IJkplayer制作视频播放的Dialog
DearLC
博客等级 码龄10年 18粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值