Add feature for equal slice-spaces from center to outside (#444).

This commit is contained in:
Philipp Jahoda 2016-02-14 21:16:14 +01:00
parent bdac14c83c
commit 92e60e5eed
4 changed files with 45 additions and 21 deletions

View file

@ -197,7 +197,7 @@ public class PieChartActivity extends DemoBase implements OnSeekBarChangeListene
xVals.add(mParties[i % mParties.length]);
PieDataSet dataSet = new PieDataSet(yVals1, "Election Results");
dataSet.setSliceSpace(2f);
dataSet.setSliceSpace(3f);
dataSet.setSelectionShift(5f);
// add a lot of colors

View file

@ -9,7 +9,7 @@ import java.util.List;
public class PieDataSet extends DataSet<Entry> implements IPieDataSet {
/** the space in degrees between the chart-slices, default 0f */
/** the space in pixels between the chart-slices, default 0f */
private float mSliceSpace = 0f;
/** indicates the selection distance of a pie slice */
@ -37,19 +37,19 @@ public class PieDataSet extends DataSet<Entry> implements IPieDataSet {
}
/**
* sets the space that is left out between the piechart-slices, default: 0°
* --> no space, maximum 45, minimum 0 (no space)
* Sets the space that is left out between the piechart-slices in dp.
* Default: 0 --> no space, maximum 20f
*
* @param degrees
* @param spaceDp
*/
public void setSliceSpace(float degrees) {
public void setSliceSpace(float spaceDp) {
if (degrees > 45)
degrees = 45f;
if (degrees < 0)
degrees = 0f;
if (spaceDp > 20)
spaceDp = 20f;
if (spaceDp < 0)
spaceDp = 0f;
mSliceSpace = degrees;
mSliceSpace = Utils.convertDpToPixel(spaceDp);
}
@Override

View file

@ -9,7 +9,7 @@ public interface IPieDataSet extends IDataSet<Entry> {
/**
* Returns the space that is set to be between the piechart-slices of this
* DataSet, in degrees.
* DataSet, in pixels.
*
* @return
*/

View file

@ -9,6 +9,8 @@ import android.graphics.Paint.Align;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.graphics.PointF;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.os.Build;
import android.text.Layout;
@ -40,6 +42,8 @@ public class PieChartRenderer extends DataRenderer {
protected Paint mHolePaint;
protected Paint mTransparentCirclePaint;
protected Paint mSliceSpacePaint;
/**
* paint object for the text that can be displayed in the center of the
* chart
@ -75,11 +79,15 @@ public class PieChartRenderer extends DataRenderer {
mCenterTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
mCenterTextPaint.setColor(Color.BLACK);
mCenterTextPaint.setTextSize(Utils.convertDpToPixel(12f));
//mCenterTextPaint.setTextAlign(Align.CENTER);
mValuePaint.setTextSize(Utils.convertDpToPixel(13f));
mValuePaint.setColor(Color.WHITE);
mValuePaint.setTextAlign(Align.CENTER);
mSliceSpacePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mSliceSpacePaint.setStyle(Style.STROKE);
mSliceSpacePaint.setColor(0xFFFFFFFF); // transparent
mSliceSpacePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
}
public Paint getPaintHole() {
@ -130,6 +138,11 @@ public class PieChartRenderer extends DataRenderer {
protected void drawDataSet(Canvas c, IPieDataSet dataSet) {
float sliceSpace = dataSet.getSliceSpace();
mSliceSpacePaint.setStrokeWidth(sliceSpace);
PointF center = mChart.getCenterOffsets();
float angle = 0;
float rotationAngle = mChart.getRotationAngle();
@ -141,7 +154,6 @@ public class PieChartRenderer extends DataRenderer {
for (int j = 0; j < dataSet.getEntryCount(); j++) {
float sliceAngle = drawAngles[j];
float sliceSpace = dataSet.getSliceSpace();
Entry e = dataSet.getEntryForIndex(j);
@ -153,14 +165,28 @@ public class PieChartRenderer extends DataRenderer {
mRenderPaint.setColor(dataSet.getColor(j));
mBitmapCanvas.drawArc(mChart.getCircleBox(),
rotationAngle + (angle + sliceSpace / 2f) * phaseY,
(sliceAngle - sliceSpace / 2f) * phaseY,
rotationAngle + angle * phaseY,
sliceAngle * phaseY,
true, mRenderPaint);
}
}
// draw the slice space
if(sliceSpace > 0 && dataSet.getEntryCount() > 1) {
PointF pos = Utils.getPosition(center, mChart.getRadius(), rotationAngle * phaseX + angle * phaseY);
mBitmapCanvas.drawLine(center.x, center.y, pos.x, pos.y, mSliceSpacePaint);
}
angle += sliceAngle * phaseX;
}
// cover the final slice with slice space
if(sliceSpace > 0 && dataSet.getEntryCount() > 1) {
PointF pos = Utils.getPosition(center, mChart.getRadius(), rotationAngle * phaseX + angle * phaseY);
mBitmapCanvas.drawLine(center.x, center.y, pos.x, pos.y, mSliceSpacePaint);
}
}
@Override
@ -221,10 +247,9 @@ public class PieChartRenderer extends DataRenderer {
angle = absoluteAngles[xIndex - 1] * phaseX;
final float sliceAngle = drawAngles[xIndex];
final float sliceSpace = dataSet.getSliceSpace();
// offset needed to center the drawn text in the slice
final float offset = (sliceAngle - sliceSpace / 2.f) / 2.f;
final float offset = (sliceAngle) / 2.f;
angle = angle + offset;
@ -407,7 +432,6 @@ public class PieChartRenderer extends DataRenderer {
angle = absoluteAngles[xIndex - 1] * phaseX;
float sliceAngle = drawAngles[xIndex];
float sliceSpace = set.getSliceSpace();
float shift = set.getSelectionShift();
RectF circleBox = mChart.getCircleBox();
@ -428,8 +452,8 @@ public class PieChartRenderer extends DataRenderer {
// redefine the rect that contains the arc so that the
// highlighted pie is not cut off
mBitmapCanvas.drawArc(highlighted,
rotationAngle + (angle + sliceSpace / 2f) * phaseY,
(sliceAngle - sliceSpace / 2f) * phaseY,
rotationAngle + angle * phaseY,
sliceAngle * phaseY,
true, mRenderPaint);
}
}