From 3aba4b074d5763e43385d153c3743a5ea3ec86b8 Mon Sep 17 00:00:00 2001 From: zhoupeng05 Date: Thu, 3 Mar 2022 19:17:58 +0800 Subject: [PATCH 1/2] add radar layer custom color support --- .idea/runConfigurations/MPChartExample.xml | 17 +++-- .../mpchartexample/RadarChartActivity.java | 8 +++ .../mikephil/charting/charts/RadarChart.java | 23 +++++++ .../charting/renderer/RadarChartRenderer.java | 67 ++++++++++++++----- 4 files changed, 95 insertions(+), 20 deletions(-) diff --git a/.idea/runConfigurations/MPChartExample.xml b/.idea/runConfigurations/MPChartExample.xml index e6bcf50331..7fd26b4e40 100644 --- a/.idea/runConfigurations/MPChartExample.xml +++ b/.idea/runConfigurations/MPChartExample.xml @@ -1,10 +1,13 @@ - + \ No newline at end of file diff --git a/MPChartExample/src/main/java/com/xxmassdeveloper/mpchartexample/RadarChartActivity.java b/MPChartExample/src/main/java/com/xxmassdeveloper/mpchartexample/RadarChartActivity.java index 883eb7dfc1..2b2947ffba 100644 --- a/MPChartExample/src/main/java/com/xxmassdeveloper/mpchartexample/RadarChartActivity.java +++ b/MPChartExample/src/main/java/com/xxmassdeveloper/mpchartexample/RadarChartActivity.java @@ -29,6 +29,7 @@ import com.xxmassdeveloper.mpchartexample.notimportant.DemoBase; import java.util.ArrayList; +import java.util.List; public class RadarChartActivity extends DemoBase { @@ -147,6 +148,13 @@ private void setData() { data.setValueTextColor(Color.WHITE); chart.setData(data); + List colorList = new ArrayList<>(); + colorList.add(Color.rgb(222, 166, 111)); + colorList.add(Color.rgb(220, 206, 138)); + colorList.add(Color.rgb(243, 255, 192)); + colorList.add(Color.rgb(240, 255, 240)); + colorList.add(Color.rgb(250, 255, 250)); + chart.setLayerColorList(colorList); chart.invalidate(); } diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/RadarChart.java b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/RadarChart.java index 8c0885395d..75568a6a76 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/RadarChart.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/RadarChart.java @@ -16,6 +16,8 @@ import com.github.mikephil.charting.renderer.YAxisRendererRadarChart; import com.github.mikephil.charting.utils.Utils; +import java.util.List; + /** * Implementation of the RadarChart, a "spidernet"-like chart. It works best * when displaying 5-10 entries per DataSet. @@ -64,6 +66,8 @@ public class RadarChart extends PieRadarChartBase { */ private YAxis mYAxis; + private List colorList; + protected YAxisRendererRadarChart mYAxisRenderer; protected XAxisRendererRadarChart mXAxisRenderer; @@ -179,6 +183,25 @@ public float getSliceAngle() { return 360f / (float) mData.getMaxEntryCountSet().getEntryCount(); } + + public void setLayerColorList(List colorList) { + if (colorList == null || colorList.size() == 0) { + return; + } + this.colorList = colorList; + } + + public boolean isCustomLayerColorEnable() { + if (mData == null) { + return false; + } + return colorList != null && colorList.size() == mData.getEntryCount(); + } + + public List getLayerColorList() { + return colorList; + } + @Override public int getIndexForAngle(float angle) { diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/RadarChartRenderer.java b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/RadarChartRenderer.java index dbf0e8f807..c9a911e6b7 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/RadarChartRenderer.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/RadarChartRenderer.java @@ -28,6 +28,12 @@ public class RadarChartRenderer extends LineRadarRenderer { protected Paint mWebPaint; protected Paint mHighlightCirclePaint; + private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + private Path previousPath = new Path(); + private Path innerArea = new Path(); + private Path temp = new Path(); + + public RadarChartRenderer(RadarChart chart, ChartAnimator animator, ViewPortHandler viewPortHandler) { super(animator, viewPortHandler); @@ -38,6 +44,10 @@ public RadarChartRenderer(RadarChart chart, ChartAnimator animator, mHighlightPaint.setStrokeWidth(2f); mHighlightPaint.setColor(Color.rgb(255, 187, 115)); + paint.setStyle(Paint.Style.FILL); + paint.setStrokeWidth(2f); + paint.setColor(Color.RED); + mWebPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mWebPaint.setStyle(Paint.Style.STROKE); @@ -70,6 +80,7 @@ public void drawData(Canvas c) { } protected Path mDrawDataSetSurfacePathBuffer = new Path(); + /** * Draws the RadarDataSet * @@ -89,7 +100,7 @@ protected void drawDataSet(Canvas c, IRadarDataSet dataSet, int mostEntries) { float factor = mChart.getFactor(); MPPointF center = mChart.getCenterOffsets(); - MPPointF pOut = MPPointF.getInstance(0,0); + MPPointF pOut = MPPointF.getInstance(0, 0); Path surface = mDrawDataSetSurfacePathBuffer; surface.reset(); @@ -159,8 +170,8 @@ public void drawValues(Canvas c) { float factor = mChart.getFactor(); MPPointF center = mChart.getCenterOffsets(); - MPPointF pOut = MPPointF.getInstance(0,0); - MPPointF pIcon = MPPointF.getInstance(0,0); + MPPointF pOut = MPPointF.getInstance(0, 0); + MPPointF pIcon = MPPointF.getInstance(0, 0); float yoffset = Utils.convertDpToPixel(5f); @@ -182,11 +193,11 @@ public void drawValues(Canvas c) { RadarEntry entry = dataSet.getEntryForIndex(j); - Utils.getPosition( - center, - (entry.getY() - mChart.getYChartMin()) * factor * phaseY, - sliceangle * j * phaseX + mChart.getRotationAngle(), - pOut); + Utils.getPosition( + center, + (entry.getY() - mChart.getYChartMin()) * factor * phaseY, + sliceangle * j * phaseX + mChart.getRotationAngle(), + pOut); if (dataSet.isDrawValuesEnabled()) { drawValue(c, @@ -216,8 +227,8 @@ public void drawValues(Canvas c) { Utils.drawImage( c, icon, - (int)pIcon.x, - (int)pIcon.y, + (int) pIcon.x, + (int) pIcon.y, icon.getIntrinsicWidth(), icon.getIntrinsicHeight()); } @@ -255,7 +266,7 @@ protected void drawWeb(Canvas c) { final int xIncrements = 1 + mChart.getSkipWebLineCount(); int maxEntryCount = mChart.getData().getMaxEntryCountSet().getEntryCount(); - MPPointF p = MPPointF.getInstance(0,0); + MPPointF p = MPPointF.getInstance(0, 0); for (int i = 0; i < maxEntryCount; i += xIncrements) { Utils.getPosition( @@ -275,21 +286,44 @@ protected void drawWeb(Canvas c) { int labelCount = mChart.getYAxis().mEntryCount; - MPPointF p1out = MPPointF.getInstance(0,0); - MPPointF p2out = MPPointF.getInstance(0,0); - for (int j = 0; j < labelCount; j++) { + MPPointF p1out = MPPointF.getInstance(0, 0); + MPPointF p2out = MPPointF.getInstance(0, 0); + for (int j = 0; j < labelCount; j++) { + if (mChart.isCustomLayerColorEnable()) { + innerArea.rewind(); + paint.setColor(mChart.getLayerColorList().get(j)); + } for (int i = 0; i < mChart.getData().getEntryCount(); i++) { - float r = (mChart.getYAxis().mEntries[j] - mChart.getYChartMin()) * factor; Utils.getPosition(center, r, sliceangle * i + rotationangle, p1out); Utils.getPosition(center, r, sliceangle * (i + 1) + rotationangle, p2out); c.drawLine(p1out.x, p1out.y, p2out.x, p2out.y, mWebPaint); + if (mChart.isCustomLayerColorEnable()) { + if (p1out.x != p2out.x) { + if (i == 0) { + innerArea.moveTo(p1out.x, p1out.y); + } else { + innerArea.lineTo(p1out.x, p1out.y); + } + innerArea.lineTo(p2out.x, p2out.y); + } + } } + if (mChart.isCustomLayerColorEnable()) { + temp.set(innerArea); + if (!innerArea.isEmpty()) { + boolean result = innerArea.op(previousPath, Path.Op.DIFFERENCE); + if (result) { + c.drawPath(innerArea, paint); + } + } + previousPath.set(temp); + } } MPPointF.recycleInstance(p1out); MPPointF.recycleInstance(p2out); @@ -305,7 +339,7 @@ public void drawHighlighted(Canvas c, Highlight[] indices) { float factor = mChart.getFactor(); MPPointF center = mChart.getCenterOffsets(); - MPPointF pOut = MPPointF.getInstance(0,0); + MPPointF pOut = MPPointF.getInstance(0, 0); RadarData radarData = mChart.getData(); @@ -362,6 +396,7 @@ public void drawHighlighted(Canvas c, Highlight[] indices) { } protected Path mDrawHighlightCirclePathBuffer = new Path(); + public void drawHighlightCircle(Canvas c, MPPointF point, float innerRadius, From b0deba0126885c8db915ad0ce8e36c8e39b3f37c Mon Sep 17 00:00:00 2001 From: zhoupeng05 Date: Fri, 4 Mar 2022 13:26:56 +0800 Subject: [PATCH 2/2] update enable layer custom code change --- .../java/com/github/mikephil/charting/charts/RadarChart.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/RadarChart.java b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/RadarChart.java index 75568a6a76..a0cb7b48bb 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/RadarChart.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/RadarChart.java @@ -195,7 +195,7 @@ public boolean isCustomLayerColorEnable() { if (mData == null) { return false; } - return colorList != null && colorList.size() == mData.getEntryCount(); + return colorList != null && colorList.size() == getYAxis().mEntryCount; } public List getLayerColorList() {