Skip to content

Commit c0ee877

Browse files
authored
Merge pull request #108 from mklkj/feature/bar-chart-rounded
Add option to make bars rounded in bar chart
2 parents 77f989c + a403871 commit c0ee877

File tree

5 files changed

+70
-12
lines changed

5 files changed

+70
-12
lines changed

MPChartExample/src/main/java/com/xxmassdeveloper/mpchartexample/BarChartActivity.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ protected void onCreate(Bundle savedInstanceState) {
7070

7171
chart = findViewById(R.id.chart1);
7272
chart.setOnChartValueSelectedListener(this);
73+
chart.setRoundedBarRadius(50f);
7374

7475
chart.setDrawBarShadow(false);
7576
chart.setDrawValueAboveBar(true);

MPChartLib/src/main/java/com/github/mikephil/charting/charts/BarChart.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,16 @@ public class BarChart extends BarLineChartBase<BarData> implements BarDataProvid
3636
*/
3737
private boolean mDrawBarShadow = false;
3838

39+
/**
40+
* if set to true, the bar chart's bars would be round on all corners instead of rectangular
41+
*/
42+
private boolean mDrawRoundedBars;
43+
44+
/**
45+
* the radius of the rounded bar chart bars
46+
*/
47+
private float mRoundedBarRadius = 0f;
48+
3949
private boolean mFitBars = false;
4050

4151
public BarChart(Context context) {
@@ -54,7 +64,7 @@ public BarChart(Context context, AttributeSet attrs, int defStyle) {
5464
protected void init() {
5565
super.init();
5666

57-
mRenderer = new BarChartRenderer(this, mAnimator, mViewPortHandler);
67+
mRenderer = new BarChartRenderer(this, mAnimator, mViewPortHandler, mDrawRoundedBars, mRoundedBarRadius);
5868

5969
setHighlighter(new BarHighlighter(this));
6070

@@ -255,4 +265,14 @@ public void groupBars(float fromX, float groupSpace, float barSpace) {
255265
notifyDataSetChanged();
256266
}
257267
}
268+
/**
269+
* Used to enable rounded bar chart bars and set the radius of the rounded bars
270+
*
271+
* @param mRoundedBarRadius - the radius of the rounded bars
272+
*/
273+
public void setRoundedBarRadius(float mRoundedBarRadius) {
274+
this.mRoundedBarRadius = mRoundedBarRadius;
275+
this.mDrawRoundedBars = true;
276+
init();
277+
}
258278
}

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

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,16 @@ public class BarChartRenderer extends BarLineScatterCandleBubbleRenderer {
3737
protected Paint mShadowPaint;
3838
protected Paint mBarBorderPaint;
3939

40+
/**
41+
* if set to true, the bar chart's bars would be round on all corners instead of rectangular
42+
*/
43+
private boolean mDrawRoundedBars;
44+
45+
/**
46+
* the radius of the rounded bar chart bars
47+
*/
48+
private float mRoundedBarRadius = 0f;
49+
4050
public BarChartRenderer(BarDataProvider chart, ChartAnimator animator,
4151
ViewPortHandler viewPortHandler) {
4252
super(animator, viewPortHandler);
@@ -55,6 +65,13 @@ public BarChartRenderer(BarDataProvider chart, ChartAnimator animator,
5565
mBarBorderPaint.setStyle(Paint.Style.STROKE);
5666
}
5767

68+
public BarChartRenderer(BarDataProvider chart, ChartAnimator animator,
69+
ViewPortHandler viewPortHandler, boolean mDrawRoundedBars, float mRoundedBarRadius) {
70+
this(chart, animator, viewPortHandler);
71+
this.mDrawRoundedBars = mDrawRoundedBars;
72+
this.mRoundedBarRadius = mRoundedBarRadius;
73+
}
74+
5875
@Override
5976
public void initBuffers() {
6077

@@ -133,7 +150,11 @@ protected void drawDataSet(Canvas c, IBarDataSet dataSet, int index) {
133150
mBarShadowRectBuffer.top = mViewPortHandler.contentTop();
134151
mBarShadowRectBuffer.bottom = mViewPortHandler.contentBottom();
135152

136-
c.drawRect(mBarShadowRectBuffer, mShadowPaint);
153+
if (mDrawRoundedBars) {
154+
c.drawRoundRect(mBarShadowRectBuffer, mRoundedBarRadius, mRoundedBarRadius, mShadowPaint);
155+
} else {
156+
c.drawRect(mBarShadowRectBuffer, mShadowPaint);
157+
}
137158
}
138159
}
139160

@@ -178,16 +199,27 @@ protected void drawDataSet(Canvas c, IBarDataSet dataSet, int index) {
178199
buffer.buffer[j + 1],
179200
buffer.buffer[j + 2],
180201
buffer.buffer[j + 3],
181-
isInverted ? Fill.Direction.DOWN : Fill.Direction.UP);
202+
isInverted ? Fill.Direction.DOWN : Fill.Direction.UP,
203+
mRoundedBarRadius);
182204
}
183205
else {
184-
c.drawRect(buffer.buffer[j], buffer.buffer[j + 1], buffer.buffer[j + 2],
185-
buffer.buffer[j + 3], mRenderPaint);
206+
if (mDrawRoundedBars) {
207+
c.drawRoundRect(new RectF(buffer.buffer[j], buffer.buffer[j + 1], buffer.buffer[j + 2],
208+
buffer.buffer[j + 3]), mRoundedBarRadius, mRoundedBarRadius, mRenderPaint);
209+
} else {
210+
c.drawRect(buffer.buffer[j], buffer.buffer[j + 1], buffer.buffer[j + 2],
211+
buffer.buffer[j + 3], mRenderPaint);
212+
}
186213
}
187214

188215
if (drawBorder) {
189-
c.drawRect(buffer.buffer[j], buffer.buffer[j + 1], buffer.buffer[j + 2],
190-
buffer.buffer[j + 3], mBarBorderPaint);
216+
if (mDrawRoundedBars) {
217+
c.drawRoundRect(new RectF(buffer.buffer[j], buffer.buffer[j + 1], buffer.buffer[j + 2],
218+
buffer.buffer[j + 3]), mRoundedBarRadius, mRoundedBarRadius, mBarBorderPaint);
219+
} else {
220+
c.drawRect(buffer.buffer[j], buffer.buffer[j + 1], buffer.buffer[j + 2],
221+
buffer.buffer[j + 3], mBarBorderPaint);
222+
}
191223
}
192224
}
193225
}
@@ -487,7 +519,11 @@ public void drawHighlighted(Canvas c, Highlight[] indices) {
487519

488520
setHighlightDrawPos(high, mBarRect);
489521

490-
c.drawRect(mBarRect, mHighlightPaint);
522+
if (mDrawRoundedBars) {
523+
c.drawRoundRect(new RectF(mBarRect), mRoundedBarRadius, mRoundedBarRadius, mHighlightPaint);
524+
} else {
525+
c.drawRect(mBarRect, mHighlightPaint);
526+
}
491527
}
492528
}
493529

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,8 @@ protected void drawDataSet(Canvas c, IBarDataSet dataSet, int index) {
143143
buffer.buffer[j + 1],
144144
buffer.buffer[j + 2],
145145
buffer.buffer[j + 3],
146-
isInverted ? Fill.Direction.LEFT : Fill.Direction.RIGHT);
146+
isInverted ? Fill.Direction.LEFT : Fill.Direction.RIGHT,
147+
0);
147148
}
148149
else {
149150
c.drawRect(buffer.buffer[j], buffer.buffer[j + 1], buffer.buffer[j + 2],

MPChartLib/src/main/java/com/github/mikephil/charting/utils/Fill.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ private void calculateFinalColor()
160160

161161
public void fillRect(Canvas c, Paint paint,
162162
float left, float top, float right, float bottom,
163-
Direction gradientDirection)
163+
Direction gradientDirection, float mRoundedBarRadius)
164164
{
165165
switch (mType)
166166
{
@@ -190,7 +190,7 @@ public void fillRect(Canvas c, Paint paint,
190190
paint.setStyle(Paint.Style.FILL);
191191
paint.setColor(mFinalColor);
192192

193-
c.drawRect(left, top, right, bottom, paint);
193+
c.drawRoundRect(new RectF(left, top, right, bottom), mRoundedBarRadius, mRoundedBarRadius, paint);
194194

195195
// restore
196196
paint.setColor(previousColor);
@@ -230,7 +230,7 @@ public void fillRect(Canvas c, Paint paint,
230230

231231
paint.setShader(gradient);
232232

233-
c.drawRect(left, top, right, bottom, paint);
233+
c.drawRoundRect(new RectF(left, top, right, bottom), mRoundedBarRadius, mRoundedBarRadius, paint);
234234
}
235235
break;
236236

0 commit comments

Comments
 (0)