Add feature for equal slice-spaces from center to outside (#444).
This commit is contained in:
parent
bdac14c83c
commit
92e60e5eed
4 changed files with 45 additions and 21 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue