Skip to content

Commit aaec1f5

Browse files
committed
DRYed scatter code, simplified IShapeRenderer implementations
1 parent 51f0e53 commit aaec1f5

11 files changed

Lines changed: 190 additions & 318 deletions

File tree

MPChartExample/src/com/xxmassdeveloper/mpchartexample/custom/CustomScatterShapeRenderer.java

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import android.graphics.Canvas;
44
import android.graphics.Paint;
55

6-
import com.github.mikephil.charting.buffer.ScatterBuffer;
76
import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
87
import com.github.mikephil.charting.renderer.scatter.IShapeRenderer;
98
import com.github.mikephil.charting.utils.ViewPortHandler;
@@ -16,28 +15,16 @@ public class CustomScatterShapeRenderer implements IShapeRenderer
1615
{
1716

1817
@Override
19-
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
20-
renderPaint, float shapeSize) {
18+
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler,
19+
float posX, float posY, Paint renderPaint) {
2120

22-
final float shapeHalf = shapeSize / 2f;
21+
final float shapeHalf = dataSet.getScatterShapeSize() / 2f;
2322

24-
for (int i = 0; i < buffer.size(); i += 2) {
25-
26-
if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
27-
break;
28-
29-
if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
30-
|| !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
31-
continue;
32-
33-
renderPaint.setColor(dataSet.getColor(i / 2));
34-
35-
c.drawLine(
36-
buffer.buffer[i] - shapeHalf,
37-
buffer.buffer[i + 1] - shapeHalf,
38-
buffer.buffer[i] + shapeHalf,
39-
buffer.buffer[i + 1] + shapeHalf,
40-
renderPaint);
41-
}
23+
c.drawLine(
24+
posX - shapeHalf,
25+
posY - shapeHalf,
26+
posX + shapeHalf,
27+
posY + shapeHalf,
28+
renderPaint);
4229
}
4330
}

MPChartLib/src/main/java/com/github/mikephil/charting/buffer/ScatterBuffer.java

Lines changed: 0 additions & 31 deletions
This file was deleted.

MPChartLib/src/main/java/com/github/mikephil/charting/renderer/ScatterChartRenderer.java

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
package com.github.mikephil.charting.renderer;
33

44
import android.graphics.Canvas;
5+
import android.util.Log;
56

67
import com.github.mikephil.charting.animation.ChartAnimator;
7-
import com.github.mikephil.charting.buffer.ScatterBuffer;
88
import com.github.mikephil.charting.data.Entry;
99
import com.github.mikephil.charting.data.ScatterData;
1010
import com.github.mikephil.charting.highlight.Highlight;
@@ -22,24 +22,13 @@ public class ScatterChartRenderer extends LineScatterCandleRadarRenderer {
2222

2323
protected ScatterDataProvider mChart;
2424

25-
protected ScatterBuffer[] mScatterBuffers;
26-
2725
public ScatterChartRenderer(ScatterDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler) {
2826
super(animator, viewPortHandler);
2927
mChart = chart;
3028
}
3129

3230
@Override
3331
public void initBuffers() {
34-
35-
ScatterData scatterData = mChart.getScatterData();
36-
37-
mScatterBuffers = new ScatterBuffer[scatterData.getDataSetCount()];
38-
39-
for (int i = 0; i < mScatterBuffers.length; i++) {
40-
IScatterDataSet set = scatterData.getDataSetByIndex(i);
41-
mScatterBuffers[i] = new ScatterBuffer(set.getEntryCount() * 2);
42-
}
4332
}
4433

4534
@Override
@@ -57,28 +46,47 @@ public void drawData(Canvas c) {
5746
}
5847
}
5948

49+
float[] mPixelBuffer = new float[2];
50+
6051
protected void drawDataSet(Canvas c, IScatterDataSet dataSet) {
6152

53+
ViewPortHandler viewPortHandler = mViewPortHandler;
54+
6255
Transformer trans = mChart.getTransformer(dataSet.getAxisDependency());
6356

64-
float phaseX = Math.max(0.f, Math.min(1.f, mAnimator.getPhaseX()));
6557
float phaseY = mAnimator.getPhaseY();
6658

67-
final float shapeSize = Utils.convertDpToPixel(dataSet.getScatterShapeSize());
59+
IShapeRenderer renderer = dataSet.getShapeRenderer();
60+
if (renderer == null) {
61+
Log.i("MISSING", "There's no IShapeRenderer specified for ScatterDataSet");
62+
return;
63+
}
6864

69-
ScatterBuffer buffer = mScatterBuffers[mChart.getScatterData().getIndexOfDataSet(dataSet)];
70-
buffer.setPhases(phaseX, phaseY);
71-
buffer.feed(dataSet);
65+
int max = (int)(Math.min(
66+
Math.ceil((float)dataSet.getEntryCount() * mAnimator.getPhaseX()),
67+
(float)dataSet.getEntryCount()));
7268

73-
trans.pointValuesToPixel(buffer.buffer);
69+
for (int i = 0; i < max; i++) {
7470

75-
IShapeRenderer renderer = dataSet.getShapeRenderer();
71+
Entry e = dataSet.getEntryForIndex(i);
72+
73+
mPixelBuffer[0] = e.getX();
74+
mPixelBuffer[1] = e.getY() * phaseY;
75+
76+
trans.pointValuesToPixel(mPixelBuffer);
77+
78+
if (!viewPortHandler.isInBoundsRight(mPixelBuffer[0]))
79+
break;
80+
81+
if (!viewPortHandler.isInBoundsLeft(mPixelBuffer[0])
82+
|| !viewPortHandler.isInBoundsY(mPixelBuffer[1]))
83+
continue;
7684

77-
if (renderer != null) {
78-
renderer.renderShape(c, dataSet, mViewPortHandler, buffer, mRenderPaint, shapeSize);
79-
} else {
80-
throw new RuntimeException("No IShapeRenderer found for provided identifier. Please make sure to add a IShapeRenderer" +
81-
" capable of rendering the provided shape.");
85+
mRenderPaint.setColor(dataSet.getColor(i / 2));
86+
renderer.renderShape(
87+
c, dataSet, mViewPortHandler,
88+
mPixelBuffer[0], mPixelBuffer[1],
89+
mRenderPaint);
8290
}
8391
}
8492

MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/ChevronDownShapeRenderer.java

Lines changed: 16 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import android.graphics.Canvas;
44
import android.graphics.Paint;
55

6-
import com.github.mikephil.charting.buffer.ScatterBuffer;
76
import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
87
import com.github.mikephil.charting.utils.Utils;
98
import com.github.mikephil.charting.utils.ViewPortHandler;
@@ -17,39 +16,26 @@ public class ChevronDownShapeRenderer implements IShapeRenderer
1716

1817

1918
@Override
20-
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
21-
renderPaint, final float shapeSize) {
19+
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler,
20+
float posX, float posY, Paint renderPaint) {
2221

23-
final float shapeHalf = shapeSize / 2f;
22+
final float shapeHalf = dataSet.getScatterShapeSize() / 2f;
2423

2524
renderPaint.setStyle(Paint.Style.STROKE);
2625
renderPaint.setStrokeWidth(Utils.convertDpToPixel(1f));
2726

28-
for (int i = 0; i < buffer.size(); i += 2) {
29-
30-
if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
31-
break;
32-
33-
if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
34-
|| !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
35-
continue;
36-
37-
renderPaint.setColor(dataSet.getColor(i / 2));
38-
39-
c.drawLine(
40-
buffer.buffer[i],
41-
buffer.buffer[i + 1] + (2 * shapeHalf),
42-
buffer.buffer[i] + (2 * shapeHalf),
43-
buffer.buffer[i + 1],
44-
renderPaint);
45-
46-
c.drawLine(
47-
buffer.buffer[i],
48-
buffer.buffer[i + 1] + (2 * shapeHalf),
49-
buffer.buffer[i] - (2 * shapeHalf),
50-
buffer.buffer[i + 1],
51-
renderPaint);
52-
}
53-
27+
c.drawLine(
28+
posX,
29+
posY + (2 * shapeHalf),
30+
posX + (2 * shapeHalf),
31+
posY,
32+
renderPaint);
33+
34+
c.drawLine(
35+
posX,
36+
posY + (2 * shapeHalf),
37+
posX - (2 * shapeHalf),
38+
posY,
39+
renderPaint);
5440
}
5541
}

MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/ChevronUpShapeRenderer.java

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import android.graphics.Canvas;
44
import android.graphics.Paint;
55

6-
import com.github.mikephil.charting.buffer.ScatterBuffer;
76
import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
87
import com.github.mikephil.charting.utils.Utils;
98
import com.github.mikephil.charting.utils.ViewPortHandler;
@@ -17,39 +16,27 @@ public class ChevronUpShapeRenderer implements IShapeRenderer
1716

1817

1918
@Override
20-
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
21-
renderPaint, final float shapeSize) {
19+
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler,
20+
float posX, float posY, Paint renderPaint) {
2221

23-
final float shapeHalf = shapeSize / 2f;
22+
final float shapeHalf = dataSet.getScatterShapeSize() / 2f;
2423

2524
renderPaint.setStyle(Paint.Style.STROKE);
2625
renderPaint.setStrokeWidth(Utils.convertDpToPixel(1f));
2726

28-
for (int i = 0; i < buffer.size(); i += 2) {
29-
30-
if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
31-
break;
32-
33-
if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
34-
|| !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
35-
continue;
36-
37-
renderPaint.setColor(dataSet.getColor(i / 2));
38-
39-
c.drawLine(
40-
buffer.buffer[i],
41-
buffer.buffer[i + 1] - (2 * shapeHalf),
42-
buffer.buffer[i] + (2 * shapeHalf),
43-
buffer.buffer[i + 1],
44-
renderPaint);
45-
46-
c.drawLine(
47-
buffer.buffer[i],
48-
buffer.buffer[i + 1] - (2 * shapeHalf),
49-
buffer.buffer[i] - (2 * shapeHalf),
50-
buffer.buffer[i + 1],
51-
renderPaint);
52-
}
27+
c.drawLine(
28+
posX,
29+
posY - (2 * shapeHalf),
30+
posX + (2 * shapeHalf),
31+
posY,
32+
renderPaint);
33+
34+
c.drawLine(
35+
posX,
36+
posY - (2 * shapeHalf),
37+
posX - (2 * shapeHalf),
38+
posY,
39+
renderPaint);
5340

5441
}
5542
}

MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/CircleShapeRenderer.java

Lines changed: 24 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import android.graphics.Canvas;
44
import android.graphics.Paint;
55

6-
import com.github.mikephil.charting.buffer.ScatterBuffer;
76
import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
87
import com.github.mikephil.charting.utils.ColorTemplate;
98
import com.github.mikephil.charting.utils.Utils;
@@ -17,9 +16,10 @@ public class CircleShapeRenderer implements IShapeRenderer
1716
{
1817

1918
@Override
20-
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
21-
renderPaint, final float shapeSize) {
19+
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler,
20+
float posX, float posY, Paint renderPaint) {
2221

22+
final float shapeSize = dataSet.getScatterShapeSize();
2323
final float shapeHalf = shapeSize / 2f;
2424
final float shapeHoleSizeHalf = Utils.convertDpToPixel(dataSet.getScatterShapeHoleRadius());
2525
final float shapeHoleSize = shapeHoleSizeHalf * 2.f;
@@ -28,46 +28,34 @@ public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewP
2828

2929
final int shapeHoleColor = dataSet.getScatterShapeHoleColor();
3030

31-
for (int i = 0; i < buffer.size(); i += 2) {
31+
if (shapeSize > 0.0) {
32+
renderPaint.setStyle(Paint.Style.STROKE);
33+
renderPaint.setStrokeWidth(shapeStrokeSize);
3234

33-
if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
34-
break;
35+
c.drawCircle(
36+
posX,
37+
posY,
38+
shapeHoleSizeHalf + shapeStrokeSizeHalf,
39+
renderPaint);
3540

36-
if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
37-
|| !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
38-
continue;
39-
40-
renderPaint.setColor(dataSet.getColor(i / 2));
41-
42-
if (shapeSize > 0.0) {
43-
renderPaint.setStyle(Paint.Style.STROKE);
44-
renderPaint.setStrokeWidth(shapeStrokeSize);
45-
46-
c.drawCircle(
47-
buffer.buffer[i],
48-
buffer.buffer[i + 1],
49-
shapeHoleSizeHalf + shapeStrokeSizeHalf,
50-
renderPaint);
51-
52-
if (shapeHoleColor != ColorTemplate.COLOR_NONE) {
53-
renderPaint.setStyle(Paint.Style.FILL);
54-
55-
renderPaint.setColor(shapeHoleColor);
56-
c.drawCircle(
57-
buffer.buffer[i],
58-
buffer.buffer[i + 1],
59-
shapeHoleSizeHalf,
60-
renderPaint);
61-
}
62-
} else {
41+
if (shapeHoleColor != ColorTemplate.COLOR_NONE) {
6342
renderPaint.setStyle(Paint.Style.FILL);
6443

44+
renderPaint.setColor(shapeHoleColor);
6545
c.drawCircle(
66-
buffer.buffer[i],
67-
buffer.buffer[i + 1],
68-
shapeHalf,
46+
posX,
47+
posY,
48+
shapeHoleSizeHalf,
6949
renderPaint);
7050
}
51+
} else {
52+
renderPaint.setStyle(Paint.Style.FILL);
53+
54+
c.drawCircle(
55+
posX,
56+
posY,
57+
shapeHalf,
58+
renderPaint);
7159
}
7260

7361
}

0 commit comments

Comments
 (0)