Android-MPAndroidChart:RadarChart(雷达蜘蛛图)绘制圆点

文章详细描述了RadarChart类中用于绘制数据集和添加数值圆点、线条特征的方法,包括`drawDataSet`、`drawValues`等,以及如何自定义颜色、半径和是否显示这些元素。
摘要由CSDN通过智能技术生成
  • paint for drawing the web

*/

protected Paint mWebPaint;

protected Paint mHighlightCirclePaint;

public RadarChartRenderer(RadarChart chart, ChartAnimator animator,

ViewPortHandler viewPortHandler) {

super(animator, viewPortHandler);

mChart = chart;

mHighlightPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

mHighlightPaint.setStyle(Paint.Style.STROKE);

mHighlightPaint.setStrokeWidth(2f);

mHighlightPaint.setColor(Color.rgb(255, 187, 115));

mWebPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

mWebPaint.setStyle(Paint.Style.STROKE);

mHighlightCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);

mValueCirclePaint = new Paint();

}

protected Path mDrawDataSetSurfacePathBuffer = new Path();

/**

  • 绘制RadarDataSet

  • @param c

  • @param dataSet

  • @param mostEntries 条目最多的数据集的条目计数

*/

protected void drawDataSet(Canvas c, IRadarDataSet dataSet, int mostEntries) {

float phaseX = mAnimator.getPhaseX();

float phaseY = mAnimator.getPhaseY();

float sliceangle = mChart.getSliceAngle();

// 计算将值转换为像素所需的因子

float factor = mChart.getFactor();

MPPointF center = mChart.getCenterOffsets();

MPPointF pOut = MPPointF.getInstance(0, 0);

Path surface = mDrawDataSetSurfacePathBuffer;

surface.reset();

boolean hasMovedToPoint = false;

for (int j = 0; j < dataSet.getEntryCount(); j++) {

mRenderPaint.setColor(dataSet.getColor(j));

RadarEntry e = dataSet.getEntryForIndex(j);

Utils.getPosition(center, (e.getY() - mChart.getYChartMin()) * factor * phaseY, sliceangle * j * phaseX + mChart.getRotationAngle(), pOut);

if (Float.isNaN(pOut.x)) {

continue;

}

if (!hasMovedToPoint) {

surface.moveTo(pOut.x, pOut.y);

hasMovedToPoint = true;

} else {

surface.lineTo(pOut.x, pOut.y);

}

}

if (dataSet.getEntryCount() > mostEntries) {

// if this is not the largest set, draw a line to the center before closing

surface.lineTo(center.x, center.y);

}

surface.close();

if (dataSet.isDrawFilledEnabled()) {

final Drawable drawable = dataSet.getFillDrawable();

if (drawable != null) {

drawFilledPath(c, surface, drawable);

} else {

drawFilledPath(c, surface, dataSet.getFillColor(), dataSet.getFillAlpha());

}

}

mRenderPaint.setStrokeWidth(dataSet.getLineWidth());

mRenderPaint.setStyle(Paint.Style.STROKE);

// 画线(仅当禁用填充或alpha小于255时)

if (!dataSet.isDrawFilledEnabled() || dataSet.getFillAlpha() < 255) {

c.drawPath(surface, mRenderPaint);

}

MPPointF.recycleInstance(center);

MPPointF.recycleInstance(pOut);

}

private Paint mValueCirclePaint;

private float mValueCircleRadius = Utils.convertDpToPixel(5f);

private int[] mValueCircleColors;

private boolean mDrawValueCircle = false;

private float mValueCircleRadiusUp = Utils.convertDpToPixel(3f);

private int[] mValueCircleColorsUp;

private boolean mDrawValueCircleUp = false;

/**

  • 绘制数值-也就是和数值相关的位置

  • @param c

*/

@Override

public void drawValues(Canvas c) {

float phaseX = mAnimator.getPhaseX();

float phaseY = mAnimator.getPhaseY();

float sliceangle = mChart.getSliceAngle();

// 计算将值转换为像素所需的因子

float factor = mChart.getFactor();

MPPointF center = mChart.getCenterOffsets();

MPPointF pOut = MPPointF.getInstance(0, 0);

MPPointF pIcon = MPPointF.getInstance(0, 0);

float yoffset = Utils.convertDpToPixel(5f);

for (int i = 0; i < mChart.getData().getDataSetCount(); i++) {

IRadarDataSet dataSet = mChart.getData().getDataSetByIndex(i);

if (!shouldDrawValues(dataSet)) {

continue;

}

// 应用数据集定义的文本样式

applyValueTextStyle(dataSet);

ValueFormatter formatter = dataSet.getValueFormatter();

MPPointF iconsOffset = MPPointF.getInstance(dataSet.getIconsOffset());

iconsOffset.x = Utils.convertDpToPixel(iconsOffset.x);

iconsOffset.y = Utils.convertDpToPixel(iconsOffset.y);

for (int j = 0; j < dataSet.getEntryCount(); j++) {

RadarEntry entry = dataSet.getEntryForIndex(j);

Utils.getPosition(center, (entry.getY() - mChart.getYChartMin()) * factor * phaseY,

sliceangle * j * phaseX + mChart.getRotationAngle(), pOut);

if (dataSet.isDrawValuesEnabled()) {

drawValue(c, formatter.getRadarLabel(entry), pOut.x, pOut.y - yoffset, dataSet.getValueTextColor(j));

}

if (entry.getIcon() != null && dataSet.isDrawIconsEnabled()) {

Drawable icon = entry.getIcon();

Utils.getPosition(center, (entry.getY()) * factor * phaseY + iconsOffset.y, sliceangle * j * phaseX + mChart.getRotationAngle(), pIcon);

//无检查SuspiciousNameCombination

pIcon.y += iconsOffset.x;

Utils.drawImage(c, icon, (int) pIcon.x, (int) pIcon.y, icon.getIntrinsicWidth(), icon.getIntrinsicHeight());

}

if (mDrawValueCircle) {

mValueCirclePaint.setColor(mValueCircleColors == null || mValueCircleColors.length == 0 ? Color.BLACK : this.mValueCircleColors[i % mValueCircleColors.length]);

c.drawCircle(pOut.x, pOut.y, mValueCircleRadius, mValueCirclePaint);

}

if (mDrawValueCircleUp) {

mValueCirclePaint.setColor(mValueCircleColorsUp == null || mValueCircleColorsUp.length == 0 ? Color.BLACK : this.mValueCircleColorsUp[i % mValueCircleColorsUp.length]);

c.drawCircle(pOut.x, pOut.y, mValueCircleRadiusUp, mValueCirclePaint);

}

// c.drawCircle(center.x, center.y, 8, mWebPaint);

}

MPPointF.recycleInstance(iconsOffset);

}

MPPointF.recycleInstance(center);

MPPointF.recycleInstance(pOut);

MPPointF.recycleInstance(pIcon);

}

/**

  • 数值圆点颜色

  • @param colors 颜色

*/

public void setValueCircleColor(int[] colors, int[] colorsUp) {

this.mValueCircleColors = colors;

this.mValueCircleColorsUp = colorsUp;

}

/**

  • 数值圆点半径

  • @param radius 半径

*/

public void setValueCircleRadius(float radius, float radiusUp) {

this.mValueCircleRadius = Utils.convertDpToPixel(radius);

this.mValueCircleRadiusUp = Utils.convertDpToPixel(radiusUp);

}

/**

  • 是否绘制数值圆点

  • @param draw

*/

public void setDrawValueCircle(boolean draw, boolean drawUp) {

this.mDrawValueCircleUp = drawUp;

this.mDrawValueCircle = draw;

}

}

RadarChart添加三个方法

public class RadarChart extends PieRadarChartBase {

/**

  • 顶角圆点颜色

  • @param colors 颜色

*/
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

最后这里放上我这段时间复习的资料,这个资料也是偶然一位朋友分享给我的,里面包含了腾讯、字节跳动、阿里、百度2019-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。

还有 高级架构技术进阶脑图、高级进阶架构资料 帮助大家学习提升进阶,也可以分享给身边好友一起学习。

一起互勉~

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

713775700011)]

最后

最后这里放上我这段时间复习的资料,这个资料也是偶然一位朋友分享给我的,里面包含了腾讯、字节跳动、阿里、百度2019-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。

还有 高级架构技术进阶脑图、高级进阶架构资料 帮助大家学习提升进阶,也可以分享给身边好友一起学习。

[外链图片转存中…(img-kWoWWkPU-1713775700012)]

[外链图片转存中…(img-qvo4UTFR-1713775700013)]

一起互勉~

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值