Skip to content

Commit 569f890

Browse files
committed
Merge pull request PhilJay#1418 from danielgindi/radar-animation
Radar animation
2 parents 19f1b3b + f3bd299 commit 569f890

5 files changed

Lines changed: 97 additions & 25 deletions

File tree

MPChartExample/res/menu/pie.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,9 @@
3737
android:id="@+id/actionSave"
3838
android:title="Save to Gallery">
3939
</item>
40+
<item
41+
android:id="@+id/actionToggleSpin"
42+
android:title="Spin Animation">
43+
</item>
4044

4145
</menu>

MPChartExample/res/menu/radar.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,18 @@
1313
android:id="@+id/actionToggleHighlight"
1414
android:title="Toggle Highlight">
1515
</item>
16+
<item
17+
android:id="@+id/animateX"
18+
android:title="Animate X">
19+
</item>
20+
<item
21+
android:id="@+id/animateY"
22+
android:title="Animate Y">
23+
</item>
24+
<item
25+
android:id="@+id/animateXY"
26+
android:title="Animate XY">
27+
</item>
1628
<item
1729
android:id="@+id/actionSave"
1830
android:title="Save to SD">

MPChartExample/src/com/xxmassdeveloper/mpchartexample/RadarChartActivitry.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ protected void onCreate(Bundle savedInstanceState) {
5656

5757
setData();
5858

59+
mChart.animateXY(
60+
1400, 1400,
61+
Easing.EasingOption.EaseInOutQuad,
62+
Easing.EasingOption.EaseInOutQuad);
63+
5964
XAxis xAxis = mChart.getXAxis();
6065
xAxis.setTypeface(tf);
6166
xAxis.setTextSize(9f);
@@ -140,6 +145,18 @@ public boolean onOptionsItemSelected(MenuItem item) {
140145
mChart.invalidate();
141146
break;
142147
}
148+
case R.id.animateX: {
149+
mChart.animateX(1400);
150+
break;
151+
}
152+
case R.id.animateY: {
153+
mChart.animateY(1400);
154+
break;
155+
}
156+
case R.id.animateXY: {
157+
mChart.animateXY(1400, 1400);
158+
break;
159+
}
143160
case R.id.actionToggleSpin: {
144161
mChart.spin(2000, mChart.getRotationAngle(), mChart.getRotationAngle() + 360, Easing.EasingOption.EaseInCubic);
145162
break;

MPChartLib/src/com/github/mikephil/charting/renderer/PieChartRenderer.java

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,9 @@ protected void drawDataSet(Canvas c, IPieDataSet dataSet) {
131131
float angle = 0;
132132
float rotationAngle = mChart.getRotationAngle();
133133

134+
float phaseX = mAnimator.getPhaseX();
135+
float phaseY = mAnimator.getPhaseY();
136+
134137
float[] drawAngles = mChart.getDrawAngles();
135138

136139
for (int j = 0; j < dataSet.getEntryCount(); j++) {
@@ -148,13 +151,13 @@ protected void drawDataSet(Canvas c, IPieDataSet dataSet) {
148151

149152
mRenderPaint.setColor(dataSet.getColor(j));
150153
mBitmapCanvas.drawArc(mChart.getCircleBox(),
151-
rotationAngle + (angle + sliceSpace / 2f) * mAnimator.getPhaseY(),
152-
(sliceAngle - sliceSpace / 2f) * mAnimator.getPhaseY(),
154+
rotationAngle + (angle + sliceSpace / 2f) * phaseY,
155+
(sliceAngle - sliceSpace / 2f) * phaseY,
153156
true, mRenderPaint);
154157
}
155158
}
156159

157-
angle += sliceAngle * mAnimator.getPhaseX();
160+
angle += sliceAngle * phaseX;
158161
}
159162
}
160163

@@ -169,6 +172,9 @@ public void drawValues(Canvas c) {
169172
float[] drawAngles = mChart.getDrawAngles();
170173
float[] absoluteAngles = mChart.getAbsoluteAngles();
171174

175+
float phaseX = mAnimator.getPhaseX();
176+
float phaseY = mAnimator.getPhaseY();
177+
172178
float off = r / 10f * 3.6f;
173179

174180
if (mChart.isDrawHoleEnabled()) {
@@ -184,7 +190,8 @@ public void drawValues(Canvas c) {
184190

185191
boolean drawXVals = mChart.isDrawSliceTextEnabled();
186192

187-
int cnt = 0;
193+
float angle;
194+
int xIndex = 0;
188195

189196
for (int i = 0; i < dataSets.size(); i++) {
190197

@@ -202,14 +209,23 @@ public void drawValues(Canvas c) {
202209
int entryCount = dataSet.getEntryCount();
203210

204211
for (int j = 0, maxEntry = Math.min(
205-
(int) Math.ceil(entryCount * mAnimator.getPhaseX()), entryCount); j < maxEntry; j++) {
212+
(int) Math.ceil(entryCount * phaseX), entryCount); j < maxEntry; j++) {
206213

207214
Entry entry = dataSet.getEntryForIndex(j);
208215

216+
if (xIndex == 0)
217+
angle = 0.f;
218+
else
219+
angle = absoluteAngles[xIndex - 1] * phaseX;
220+
221+
final float sliceAngle = drawAngles[xIndex];
222+
final float sliceSpace = dataSet.getSliceSpace();
223+
209224
// offset needed to center the drawn text in the slice
210-
float offset = drawAngles[cnt] / 2;
225+
final float offset = (sliceAngle - sliceSpace / 2.f) / 2.f;
226+
227+
angle = angle + offset;
211228

212-
float angle = (absoluteAngles[cnt] - offset) * mAnimator.getPhaseY();
213229
// calculate the text position
214230
float x = (float) (r
215231
* Math.cos(Math.toRadians(rotationAngle + angle))
@@ -234,15 +250,15 @@ public void drawValues(Canvas c) {
234250
c.drawText(data.getXVals().get(j), x, y + lineHeight,
235251
mValuePaint);
236252

237-
} else if (drawXVals && !drawYVals) {
253+
} else if (drawXVals) {
238254
if (j < data.getXValCount())
239255
c.drawText(data.getXVals().get(j), x, y + lineHeight / 2f, mValuePaint);
240-
} else if (!drawXVals && drawYVals) {
256+
} else if (drawYVals) {
241257

242258
drawValue(c, formatter, value, entry, 0, x, y + lineHeight / 2f);
243259
}
244260

245-
cnt++;
261+
xIndex++;
246262
}
247263
}
248264
}
@@ -390,8 +406,11 @@ protected void drawCenterText(Canvas c) {
390406
@Override
391407
public void drawHighlighted(Canvas c, Highlight[] indices) {
392408

409+
float phaseX = mAnimator.getPhaseX();
410+
float phaseY = mAnimator.getPhaseY();
411+
412+
float angle;
393413
float rotationAngle = mChart.getRotationAngle();
394-
float angle = 0f;
395414

396415
float[] drawAngles = mChart.getDrawAngles();
397416
float[] absoluteAngles = mChart.getAbsoluteAngles();
@@ -413,7 +432,7 @@ public void drawHighlighted(Canvas c, Highlight[] indices) {
413432
if (xIndex == 0)
414433
angle = 0.f;
415434
else
416-
angle = absoluteAngles[xIndex - 1] * mAnimator.getPhaseX();
435+
angle = absoluteAngles[xIndex - 1] * phaseX;
417436

418437
float sliceAngle = drawAngles[xIndex];
419438
float sliceSpace = set.getSliceSpace();
@@ -437,8 +456,8 @@ public void drawHighlighted(Canvas c, Highlight[] indices) {
437456
// redefine the rect that contains the arc so that the
438457
// highlighted pie is not cut off
439458
mBitmapCanvas.drawArc(highlighted,
440-
rotationAngle + (angle + sliceSpace / 2f) * mAnimator.getPhaseY(),
441-
(sliceAngle - sliceSpace / 2f) * mAnimator.getPhaseY(),
459+
rotationAngle + (angle + sliceSpace / 2f) * phaseY,
460+
(sliceAngle - sliceSpace / 2f) * phaseY,
442461
true, mRenderPaint);
443462
}
444463
}
@@ -458,6 +477,9 @@ protected void drawRoundedSlices(Canvas c) {
458477
if (!dataSet.isVisible())
459478
return;
460479

480+
float phaseX = mAnimator.getPhaseX();
481+
float phaseY = mAnimator.getPhaseY();
482+
461483
PointF center = mChart.getCenterCircleBox();
462484
float r = mChart.getRadius();
463485

@@ -478,16 +500,16 @@ protected void drawRoundedSlices(Canvas c) {
478500

479501
float x = (float) ((r - circleRadius)
480502
* Math.cos(Math.toRadians((angle + sliceAngle)
481-
* mAnimator.getPhaseY())) + center.x);
503+
* phaseY)) + center.x);
482504
float y = (float) ((r - circleRadius)
483505
* Math.sin(Math.toRadians((angle + sliceAngle)
484-
* mAnimator.getPhaseY())) + center.y);
506+
* phaseY)) + center.y);
485507

486508
mRenderPaint.setColor(dataSet.getColor(j));
487509
mBitmapCanvas.drawCircle(x, y, circleRadius, mRenderPaint);
488510
}
489511

490-
angle += sliceAngle * mAnimator.getPhaseX();
512+
angle += sliceAngle * phaseX;
491513
}
492514
}
493515

MPChartLib/src/com/github/mikephil/charting/renderer/RadarChartRenderer.java

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ public void drawData(Canvas c) {
6464

6565
protected void drawDataSet(Canvas c, IRadarDataSet dataSet) {
6666

67+
float phaseX = mAnimator.getPhaseX();
68+
float phaseY = mAnimator.getPhaseY();
69+
6770
float sliceangle = mChart.getSliceAngle();
6871

6972
// calculate the factor that is needed for transforming the value to
@@ -82,8 +85,10 @@ protected void drawDataSet(Canvas c, IRadarDataSet dataSet) {
8285

8386
Entry e = dataSet.getEntryForIndex(j);
8487

85-
PointF p = Utils.getPosition(center, (e.getVal() - mChart.getYChartMin()) * factor,
86-
sliceangle * j + mChart.getRotationAngle());
88+
PointF p = Utils.getPosition(
89+
center,
90+
(e.getVal() - mChart.getYChartMin()) * factor * phaseY,
91+
sliceangle * j * phaseX + mChart.getRotationAngle());
8792

8893
if (Float.isNaN(p.x))
8994
continue;
@@ -125,6 +130,9 @@ protected void drawDataSet(Canvas c, IRadarDataSet dataSet) {
125130
@Override
126131
public void drawValues(Canvas c) {
127132

133+
float phaseX = mAnimator.getPhaseX();
134+
float phaseY = mAnimator.getPhaseY();
135+
128136
float sliceangle = mChart.getSliceAngle();
129137

130138
// calculate the factor that is needed for transforming the value to
@@ -149,8 +157,10 @@ public void drawValues(Canvas c) {
149157

150158
Entry entry = dataSet.getEntryForIndex(j);
151159

152-
PointF p = Utils.getPosition(center, (entry.getVal() - mChart.getYChartMin()) * factor,
153-
sliceangle * j + mChart.getRotationAngle());
160+
PointF p = Utils.getPosition(
161+
center,
162+
(entry.getVal() - mChart.getYChartMin()) * factor * phaseY,
163+
sliceangle * j * phaseX + mChart.getRotationAngle());
154164

155165
drawValue(c, dataSet.getValueFormatter(), entry.getVal(), entry, i, p.x, p.y - yoffset);
156166
}
@@ -182,8 +192,10 @@ protected void drawWeb(Canvas c) {
182192

183193
for (int i = 0; i < mChart.getData().getXValCount(); i += xIncrements) {
184194

185-
PointF p = Utils.getPosition(center, mChart.getYRange() * factor, sliceangle * i
186-
+ rotationangle);
195+
PointF p = Utils.getPosition(
196+
center,
197+
mChart.getYRange() * factor,
198+
sliceangle * i + rotationangle);
187199

188200
c.drawLine(center.x, center.y, p.x, p.y, mWebPaint);
189201
}
@@ -212,6 +224,9 @@ protected void drawWeb(Canvas c) {
212224
@Override
213225
public void drawHighlighted(Canvas c, Highlight[] indices) {
214226

227+
float phaseX = mAnimator.getPhaseX();
228+
float phaseY = mAnimator.getPhaseY();
229+
215230
float sliceangle = mChart.getSliceAngle();
216231
float factor = mChart.getFactor();
217232

@@ -239,8 +254,10 @@ public void drawHighlighted(Canvas c, Highlight[] indices) {
239254
if (Float.isNaN(y))
240255
continue;
241256

242-
PointF p = Utils.getPosition(center, y * factor,
243-
sliceangle * j + mChart.getRotationAngle());
257+
PointF p = Utils.getPosition(
258+
center,
259+
y * factor * phaseY,
260+
sliceangle * j * phaseX + mChart.getRotationAngle());
244261

245262
float[] pts = new float[]{
246263
p.x, p.y

0 commit comments

Comments
 (0)