Changes to custom scatter rendering

This commit is contained in:
Philipp Jahoda 2016-06-27 12:29:49 +02:00
parent af114d180d
commit bd5858e8c0
16 changed files with 153 additions and 203 deletions

View file

@ -110,8 +110,6 @@ public class HorizontalBarChartActivity extends DemoBase implements OnSeekBarCha
l.setPosition(LegendPosition.BELOW_CHART_LEFT);
l.setFormSize(8f);
l.setXEntrySpace(4f);
mChart.setVisibleXRange(10, 50);
}
@Override

View file

@ -54,7 +54,6 @@ public class ScatterChartActivity extends DemoBase implements OnSeekBarChangeLis
mChart = (ScatterChart) findViewById(R.id.chart1);
mChart.setDescription("");
mChart.addShapeRenderer(new CustomScatterShapeRenderer(), CustomScatterShapeRenderer.IDENTIFIER);
mChart.setOnChartValueSelectedListener(this);
@ -188,7 +187,7 @@ public class ScatterChartActivity extends DemoBase implements OnSeekBarChangeLis
set2.setScatterShapeHoleRadius(3f);
set2.setColor(ColorTemplate.COLORFUL_COLORS[1]);
ScatterDataSet set3 = new ScatterDataSet(yVals3, "DS 3");
set3.setScatterShape(CustomScatterShapeRenderer.IDENTIFIER);
set3.setShapeRenderer(new CustomScatterShapeRenderer());
set3.setColor(ColorTemplate.COLORFUL_COLORS[2]);
set1.setScatterShapeSize(8f);

View file

@ -14,8 +14,6 @@ import com.github.mikephil.charting.utils.ViewPortHandler;
*/
public class CustomScatterShapeRenderer implements ShapeRenderer {
public static final String IDENTIFIER = "single_line";
@Override
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
renderPaint, float shapeSize) {

View file

@ -13,7 +13,6 @@ import com.github.mikephil.charting.data.ScatterData;
import com.github.mikephil.charting.highlight.CombinedHighlighter;
import com.github.mikephil.charting.interfaces.dataprovider.CombinedDataProvider;
import com.github.mikephil.charting.renderer.CombinedChartRenderer;
import com.github.mikephil.charting.renderer.scatter.ShapeRenderer;
/**
* This chart class allows the combination of lines, bars, scatter and candle
@ -23,8 +22,6 @@ import com.github.mikephil.charting.renderer.scatter.ShapeRenderer;
*/
public class CombinedChart extends BarLineChartBase<CombinedData> implements CombinedDataProvider {
private ScatterChart.ShapeRendererHandler mShapeRendererHandler;
/**
* if set to true, all values are drawn above their bars, instead of below
* their top
@ -71,8 +68,6 @@ public class CombinedChart extends BarLineChartBase<CombinedData> implements Com
protected void init() {
super.init();
mShapeRendererHandler = new ScatterChart.ShapeRendererHandler();
setHighlighter(new CombinedHighlighter(this, this));
// Old default behaviour
@ -129,16 +124,6 @@ public class CombinedChart extends BarLineChartBase<CombinedData> implements Com
return mData.getBubbleData();
}
@Override
public void addShapeRenderer(ShapeRenderer shapeRenderer, String shapeIdentifier) {
mShapeRendererHandler.addShapeRenderer(shapeRenderer, shapeIdentifier);
}
@Override
public ShapeRenderer getShapeRenderer(String shapeIdentifier) {
return mShapeRendererHandler.getShapeRenderer(shapeIdentifier);
}
@Override
public boolean isDrawBarShadowEnabled() {
return mDrawBarShadow;

View file

@ -7,16 +7,6 @@ import android.util.AttributeSet;
import com.github.mikephil.charting.data.ScatterData;
import com.github.mikephil.charting.interfaces.dataprovider.ScatterDataProvider;
import com.github.mikephil.charting.renderer.ScatterChartRenderer;
import com.github.mikephil.charting.renderer.scatter.ChevronDownShapeRenderer;
import com.github.mikephil.charting.renderer.scatter.ChevronUpShapeRenderer;
import com.github.mikephil.charting.renderer.scatter.CircleShapeRenderer;
import com.github.mikephil.charting.renderer.scatter.CrossShapeRenderer;
import com.github.mikephil.charting.renderer.scatter.ShapeRenderer;
import com.github.mikephil.charting.renderer.scatter.SquareShapeRenderer;
import com.github.mikephil.charting.renderer.scatter.TriangleShapeRenderer;
import com.github.mikephil.charting.renderer.scatter.XShapeRenderer;
import java.util.HashMap;
/**
* The ScatterChart. Draws dots, triangles, squares and custom shapes into the
@ -27,9 +17,6 @@ import java.util.HashMap;
*/
public class ScatterChart extends BarLineChartBase<ScatterData> implements ScatterDataProvider {
protected ShapeRendererHandler mShapeRendererHandler;
public ScatterChart(Context context) {
super(context);
}
@ -47,8 +34,6 @@ public class ScatterChart extends BarLineChartBase<ScatterData> implements Scatt
protected void init() {
super.init();
mShapeRendererHandler = new ShapeRendererHandler();
mRenderer = new ScatterChartRenderer(this, mAnimator, mViewPortHandler);
}
@ -57,17 +42,8 @@ public class ScatterChart extends BarLineChartBase<ScatterData> implements Scatt
return mData;
}
@Override
public void addShapeRenderer(ShapeRenderer shapeRenderer, String shapeIdentifier) {
mShapeRendererHandler.addShapeRenderer(shapeRenderer, shapeIdentifier);
}
@Override
public ShapeRenderer getShapeRenderer(String shapeIdentifier) {
return mShapeRendererHandler.getShapeRenderer(shapeIdentifier);
}
public enum ScatterShape {
SQUARE("SQUARE"), CIRCLE("CIRCLE"), TRIANGLE("TRIANGLE"), CROSS("CROSS"), X("X"), CHEVRON_UP("CHEVRON_UP"),
CHEVRON_DOWN("CHEVRON_DOWN");
@ -86,52 +62,4 @@ public class ScatterChart extends BarLineChartBase<ScatterData> implements Scatt
return new ScatterShape[]{SQUARE, CIRCLE, TRIANGLE, CROSS, X, CHEVRON_UP, CHEVRON_DOWN};
}
}
/**
* Handler class for all different ShapeRenderers.
*/
protected static class ShapeRendererHandler {
/**
* Dictionary of ShapeRenderer which are responsible for drawing custom shapes.
* Can add to it your custom shapes.
* CustomShapeRenderer Implements ShapeRenderer{}
*/
protected HashMap<String, ShapeRenderer> shapeRendererList;
public ShapeRendererHandler() {
initShapeRenderers();
}
/**
* Adds a new ShapeRenderer and the shapeIdentifier it is responsible for drawing.
* This shapeIdentifier should correspond to a DataSet with the same identifier.
*
* @param shapeRenderer
* @param shapeIdentifier
*/
public void addShapeRenderer(ShapeRenderer shapeRenderer, String shapeIdentifier) {
shapeRendererList.put(shapeIdentifier, shapeRenderer);
}
public ShapeRenderer getShapeRenderer(String shapeIdentifier) {
return shapeRendererList.get(shapeIdentifier);
}
/**
* Init default ShapeRenderers.
*/
protected void initShapeRenderers() {
shapeRendererList = new HashMap<>();
shapeRendererList.put(ScatterShape.SQUARE.toString(), new SquareShapeRenderer());
shapeRendererList.put(ScatterShape.CIRCLE.toString(), new CircleShapeRenderer());
shapeRendererList.put(ScatterShape.TRIANGLE.toString(), new TriangleShapeRenderer());
shapeRendererList.put(ScatterShape.CROSS.toString(), new CrossShapeRenderer());
shapeRendererList.put(ScatterShape.X.toString(), new XShapeRenderer());
shapeRendererList.put(ScatterShape.CHEVRON_UP.toString(), new ChevronUpShapeRenderer());
shapeRendererList.put(ScatterShape.CHEVRON_DOWN.toString(), new ChevronDownShapeRenderer());
}
}
}

View file

@ -1,9 +1,14 @@
package com.github.mikephil.charting.data;
import android.graphics.drawable.shapes.Shape;
import com.github.mikephil.charting.charts.ScatterChart;
import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
import com.github.mikephil.charting.renderer.scatter.ShapeRenderer;
import com.github.mikephil.charting.renderer.scatter.SquareShapeRenderer;
import com.github.mikephil.charting.utils.ColorTemplate;
import com.github.mikephil.charting.utils.ShapeRendererHandler;
import java.util.ArrayList;
import java.util.List;
@ -16,10 +21,9 @@ public class ScatterDataSet extends LineScatterCandleRadarDataSet<Entry> impleme
private float mShapeSize = 15f;
/**
* the type of shape that is set to be drawn where the values are at,
* default ScatterShape.SQUARE
* Renderer responsible for rendering this DataSet, default: square
*/
private String mScatterShape = ScatterChart.ScatterShape.SQUARE.toString();
protected ShapeRenderer mShapeRenderer = new SquareShapeRenderer();
/**
* The radius of the hole in the shape (applies to Square, Circle and Triangle)
@ -57,7 +61,7 @@ public class ScatterDataSet extends LineScatterCandleRadarDataSet<Entry> impleme
copied.mValueColors = mValueColors;
copied.mColors = mColors;
copied.mShapeSize = mShapeSize;
copied.mScatterShape = mScatterShape;
copied.mShapeRenderer = mShapeRenderer;
copied.mScatterShapeHoleRadius = mScatterShapeHoleRadius;
copied.mScatterShapeHoleColor = mScatterShapeHoleColor;
copied.mHighlightLineWidth = mHighlightLineWidth;
@ -82,30 +86,31 @@ public class ScatterDataSet extends LineScatterCandleRadarDataSet<Entry> impleme
return mShapeSize;
}
/**
* Sets the shapeIdentifier that this DataSet should be drawn with.
* Make sure the ScatterChart has a renderer capable of rendering the provided identifier.
* Sets the ScatterShape this DataSet should be drawn with. This will search for an available ShapeRenderer and set this
* renderer for the DataSet.
*
* @param shape
*/
public void setScatterShape(ScatterChart.ScatterShape shape) {
mScatterShape = shape.toString();
ShapeRendererHandler handler = new ShapeRendererHandler();
mShapeRenderer = handler.getShapeRenderer(shape);
}
/**
* Sets the shapeIdentifier that this DataSet should be drawn with.
* Make sure the ScatterChart has a renderer capable of rendering the provided identifier.
* Sets a new ShapeRenderer responsible for drawing this DataSet.
* This can also be used to set a custom ShapeRenderer aside from the default ones.
*
* @param shapeIdentifier
* @param shapeRenderer
*/
public void setScatterShape(String shapeIdentifier) {
mScatterShape = shapeIdentifier;
public void setShapeRenderer(ShapeRenderer shapeRenderer) {
mShapeRenderer = shapeRenderer;
}
@Override
public String getScatterShape() {
return mScatterShape;
public ShapeRenderer getShapeRenderer() {
return mShapeRenderer;
}
/**

View file

@ -4,7 +4,10 @@ import com.github.mikephil.charting.charts.ScatterChart;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.realm.base.RealmLineScatterCandleRadarDataSet;
import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
import com.github.mikephil.charting.renderer.scatter.ShapeRenderer;
import com.github.mikephil.charting.renderer.scatter.SquareShapeRenderer;
import com.github.mikephil.charting.utils.ColorTemplate;
import com.github.mikephil.charting.utils.ShapeRendererHandler;
import io.realm.RealmObject;
import io.realm.RealmResults;
@ -14,17 +17,16 @@ import io.realm.RealmResults;
*/
public class RealmScatterDataSet<T extends RealmObject> extends RealmLineScatterCandleRadarDataSet<T, Entry> implements IScatterDataSet {
/**
* Renderer responsible for rendering this DataSet, default: square
*/
protected ShapeRenderer mShapeRenderer = new SquareShapeRenderer();
/**
* the size the scattershape will have, in density pixels
*/
private float mShapeSize = 10f;
/**
* the type of shape that is set to be drawn where the values are at,
* default ScatterShape.SQUARE
*/
private String mScatterShape = ScatterChart.ScatterShape.SQUARE.toString();
/**
* The radius of the hole in the shape (applies to Square, Circle and Triangle)
* - default: 0.0
@ -80,31 +82,31 @@ public class RealmScatterDataSet<T extends RealmObject> extends RealmLineScatter
return mShapeSize;
}
/**
* Sets the shape that is drawn on the position where the values are at.
* Sets the ScatterShape this DataSet should be drawn with. This will search for an available ShapeRenderer and set this
* renderer for the DataSet.
*
* @param shape
*/
public void setScatterShape(ScatterChart.ScatterShape shape) {
mScatterShape = shape.toString();
ShapeRendererHandler handler = new ShapeRendererHandler();
mShapeRenderer = handler.getShapeRenderer(shape);
}
/**
* Sets the shape that is drawn on the position where the values are at. If
* "CUSTOM" is chosen, you need to call setCustomScatterShape(...) and
* provide a path object that is drawn as the custom scattershape.
* Sets a new ShapeRenderer responsible for drawing this DataSet.
* This can also be used to set a custom ShapeRenderer aside from the default ones.
*
* @param shape
* @param shapeRenderer
*/
public void setScatterShape(String shape) {
mScatterShape = shape;
public void setShapeRenderer(ShapeRenderer shapeRenderer) {
mShapeRenderer = shapeRenderer;
}
@Override
public String getScatterShape() {
return mScatterShape;
public ShapeRenderer getShapeRenderer() {
return mShapeRenderer;
}
/**

View file

@ -6,21 +6,4 @@ import com.github.mikephil.charting.renderer.scatter.ShapeRenderer;
public interface ScatterDataProvider extends BarLineScatterCandleBubbleDataProvider {
ScatterData getScatterData();
/**
* Adds a new ShapeRenderer and the shapeIdentifier it is responsible for drawing.
* This shapeIdentifier should correspond to a DataSet with the same identifier.
*
* @param shapeRenderer
* @param shapeIdentifier
*/
void addShapeRenderer(ShapeRenderer shapeRenderer, String shapeIdentifier);
/**
* Returns the corresponding ShapeRenderer for the given identifier.
*
* @param shapeIdentifier
* @return
*/
ShapeRenderer getShapeRenderer(String shapeIdentifier);
}

View file

@ -1,6 +1,7 @@
package com.github.mikephil.charting.interfaces.datasets;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.renderer.scatter.ShapeRenderer;
/**
* Created by philipp on 21/10/15.
@ -14,13 +15,6 @@ public interface IScatterDataSet extends ILineScatterCandleRadarDataSet<Entry> {
*/
float getScatterShapeSize();
/**
* Returns all the different scattershapes the chart uses
*
* @return
*/
String getScatterShape();
/**
* Returns radius of the hole in the shape
*
@ -34,4 +28,11 @@ public interface IScatterDataSet extends ILineScatterCandleRadarDataSet<Entry> {
* @return
*/
int getScatterShapeHoleColor();
/**
* Returns the ShapeRenderer responsible for rendering this DataSet.
*
* @return
*/
ShapeRenderer getShapeRenderer();
}

View file

@ -16,7 +16,7 @@ public interface OnChartValueSelectedListener {
*
* @param e The selected Entry
* @param h The corresponding highlight object that contains information
* about the highlighted position
* about the highlighted position such as dataSetIndex, ...
*/
void onValueSelected(Entry e, Highlight h);

View file

@ -24,8 +24,7 @@ public class ScatterChartRenderer extends LineScatterCandleRadarRenderer {
protected ScatterBuffer[] mScatterBuffers;
public ScatterChartRenderer(ScatterDataProvider chart, ChartAnimator animator,
ViewPortHandler viewPortHandler) {
public ScatterChartRenderer(ScatterDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler) {
super(animator, viewPortHandler);
mChart = chart;
}
@ -64,15 +63,13 @@ public class ScatterChartRenderer extends LineScatterCandleRadarRenderer {
final float shapeSize = Utils.convertDpToPixel(dataSet.getScatterShapeSize());
ScatterBuffer buffer = mScatterBuffers[mChart.getScatterData().getIndexOfDataSet(
dataSet)];
ScatterBuffer buffer = mScatterBuffers[mChart.getScatterData().getIndexOfDataSet(dataSet)];
buffer.setPhases(phaseX, phaseY);
buffer.feed(dataSet);
trans.pointValuesToPixel(buffer.buffer);
String shape = dataSet.getScatterShape();
ShapeRenderer renderer = mChart.getShapeRenderer(shape);
ShapeRenderer renderer = dataSet.getShapeRenderer();
if (renderer != null) {
renderer.renderShape(c, dataSet, mViewPortHandler, buffer, mRenderPaint, shapeSize);

View file

@ -18,37 +18,37 @@ public class ChevronDownShapeRenderer implements ShapeRenderer {
@Override
public void renderShape(
Canvas c, IScatterDataSet dataSet,
ViewPortHandler mViewPortHandler, ScatterBuffer buffer, Paint mRenderPaint, final float shapeSize) {
ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint renderPaint, final float shapeSize) {
final float shapeHalf = shapeSize / 2f;
mRenderPaint.setStyle(Paint.Style.STROKE);
mRenderPaint.setStrokeWidth(Utils.convertDpToPixel(1f));
renderPaint.setStyle(Paint.Style.STROKE);
renderPaint.setStrokeWidth(Utils.convertDpToPixel(1f));
for (int i = 0; i < buffer.size(); i += 2) {
if (!mViewPortHandler.isInBoundsRight(buffer.buffer[i]))
if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
break;
if (!mViewPortHandler.isInBoundsLeft(buffer.buffer[i])
|| !mViewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
|| !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
continue;
mRenderPaint.setColor(dataSet.getColor(i / 2));
renderPaint.setColor(dataSet.getColor(i / 2));
c.drawLine(
buffer.buffer[i],
buffer.buffer[i + 1] + (2 * shapeHalf),
buffer.buffer[i] + (2 * shapeHalf),
buffer.buffer[i + 1],
mRenderPaint);
renderPaint);
c.drawLine(
buffer.buffer[i],
buffer.buffer[i + 1] + (2 * shapeHalf),
buffer.buffer[i] - (2 * shapeHalf),
buffer.buffer[i + 1],
mRenderPaint);
renderPaint);
}
}

View file

@ -17,37 +17,37 @@ public class ChevronUpShapeRenderer implements ShapeRenderer {
@Override
public void renderShape(Canvas c, IScatterDataSet dataSet,
ViewPortHandler mViewPortHandler, ScatterBuffer buffer, Paint mRenderPaint, final float shapeSize) {
ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint renderPaint, final float shapeSize) {
final float shapeHalf = shapeSize / 2f;
mRenderPaint.setStyle(Paint.Style.STROKE);
mRenderPaint.setStrokeWidth(Utils.convertDpToPixel(1f));
renderPaint.setStyle(Paint.Style.STROKE);
renderPaint.setStrokeWidth(Utils.convertDpToPixel(1f));
for (int i = 0; i < buffer.size(); i += 2) {
if (!mViewPortHandler.isInBoundsRight(buffer.buffer[i]))
if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
break;
if (!mViewPortHandler.isInBoundsLeft(buffer.buffer[i])
|| !mViewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
|| !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
continue;
mRenderPaint.setColor(dataSet.getColor(i / 2));
renderPaint.setColor(dataSet.getColor(i / 2));
c.drawLine(
buffer.buffer[i],
buffer.buffer[i + 1] - (2 * shapeHalf),
buffer.buffer[i] + (2 * shapeHalf),
buffer.buffer[i + 1],
mRenderPaint);
renderPaint);
c.drawLine(
buffer.buffer[i],
buffer.buffer[i + 1] - (2 * shapeHalf),
buffer.buffer[i] - (2 * shapeHalf),
buffer.buffer[i + 1],
mRenderPaint);
renderPaint);
}
}

View file

@ -17,9 +17,8 @@ public class SquareShapeRenderer implements ShapeRenderer {
@Override
public void renderShape(
Canvas c, IScatterDataSet dataSet,
ViewPortHandler mViewPortHandler, ScatterBuffer buffer, Paint mRenderPaint, final float shapeSize) {
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
renderPaint, final float shapeSize) {
final float shapeHalf = shapeSize / 2f;
final float shapeHoleSizeHalf = Utils.convertDpToPixel(dataSet.getScatterShapeHoleRadius());
@ -31,44 +30,44 @@ public class SquareShapeRenderer implements ShapeRenderer {
for (int i = 0; i < buffer.size(); i += 2) {
if (!mViewPortHandler.isInBoundsRight(buffer.buffer[i]))
if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
break;
if (!mViewPortHandler.isInBoundsLeft(buffer.buffer[i])
|| !mViewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
|| !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
continue;
mRenderPaint.setColor(dataSet.getColor(i / 2));
renderPaint.setColor(dataSet.getColor(i / 2));
if (shapeSize > 0.0) {
mRenderPaint.setStyle(Paint.Style.STROKE);
mRenderPaint.setStrokeWidth(shapeStrokeSize);
renderPaint.setStyle(Paint.Style.STROKE);
renderPaint.setStrokeWidth(shapeStrokeSize);
c.drawRect(buffer.buffer[i] - shapeHoleSizeHalf - shapeStrokeSizeHalf,
buffer.buffer[i + 1] - shapeHoleSizeHalf - shapeStrokeSizeHalf,
buffer.buffer[i] + shapeHoleSizeHalf + shapeStrokeSizeHalf,
buffer.buffer[i + 1] + shapeHoleSizeHalf + shapeStrokeSizeHalf,
mRenderPaint);
renderPaint);
if (shapeHoleColor != ColorTemplate.COLOR_NONE) {
mRenderPaint.setStyle(Paint.Style.FILL);
renderPaint.setStyle(Paint.Style.FILL);
mRenderPaint.setColor(shapeHoleColor);
renderPaint.setColor(shapeHoleColor);
c.drawRect(buffer.buffer[i] - shapeHoleSizeHalf,
buffer.buffer[i + 1] - shapeHoleSizeHalf,
buffer.buffer[i] + shapeHoleSizeHalf,
buffer.buffer[i + 1] + shapeHoleSizeHalf,
mRenderPaint);
renderPaint);
}
} else {
mRenderPaint.setStyle(Paint.Style.FILL);
renderPaint.setStyle(Paint.Style.FILL);
c.drawRect(buffer.buffer[i] - shapeHalf,
buffer.buffer[i + 1] - shapeHalf,
buffer.buffer[i] + shapeHalf,
buffer.buffer[i + 1] + shapeHalf,
mRenderPaint);
renderPaint);
}
}
}

View file

@ -18,10 +18,8 @@ public class TriangleShapeRenderer implements ShapeRenderer {
@Override
public void renderShape(
Canvas c, IScatterDataSet dataSet,
ViewPortHandler mViewPortHandler, ScatterBuffer buffer, Paint mRenderPaint, final float shapeSize) {
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
renderPaint, final float shapeSize) {
final float shapeHalf = shapeSize / 2f;
final float shapeHoleSizeHalf = Utils.convertDpToPixel(dataSet.getScatterShapeHoleRadius());
@ -30,21 +28,21 @@ public class TriangleShapeRenderer implements ShapeRenderer {
final int shapeHoleColor = dataSet.getScatterShapeHoleColor();
mRenderPaint.setStyle(Paint.Style.FILL);
renderPaint.setStyle(Paint.Style.FILL);
// create a triangle path
Path tri = new Path();
for (int i = 0; i < buffer.size(); i += 2) {
if (!mViewPortHandler.isInBoundsRight(buffer.buffer[i]))
if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
break;
if (!mViewPortHandler.isInBoundsLeft(buffer.buffer[i])
|| !mViewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
|| !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
continue;
mRenderPaint.setColor(dataSet.getColor(i / 2));
renderPaint.setColor(dataSet.getColor(i / 2));
tri.moveTo(buffer.buffer[i], buffer.buffer[i + 1] - shapeHalf);
tri.lineTo(buffer.buffer[i] + shapeHalf, buffer.buffer[i + 1] + shapeHalf);
@ -65,13 +63,13 @@ public class TriangleShapeRenderer implements ShapeRenderer {
tri.close();
c.drawPath(tri, mRenderPaint);
c.drawPath(tri, renderPaint);
tri.reset();
if (shapeSize > 0.0 &&
shapeHoleColor != ColorTemplate.COLOR_NONE) {
mRenderPaint.setColor(shapeHoleColor);
renderPaint.setColor(shapeHoleColor);
tri.moveTo(buffer.buffer[i],
buffer.buffer[i + 1] - shapeHalf + shapeStrokeSize);
@ -81,7 +79,7 @@ public class TriangleShapeRenderer implements ShapeRenderer {
buffer.buffer[i + 1] + shapeHalf - shapeStrokeSize);
tri.close();
c.drawPath(tri, mRenderPaint);
c.drawPath(tri, renderPaint);
tri.reset();
}
}

View file

@ -0,0 +1,57 @@
package com.github.mikephil.charting.utils;
import com.github.mikephil.charting.charts.ScatterChart;
import com.github.mikephil.charting.renderer.scatter.ChevronDownShapeRenderer;
import com.github.mikephil.charting.renderer.scatter.ChevronUpShapeRenderer;
import com.github.mikephil.charting.renderer.scatter.CircleShapeRenderer;
import com.github.mikephil.charting.renderer.scatter.CrossShapeRenderer;
import com.github.mikephil.charting.renderer.scatter.ShapeRenderer;
import com.github.mikephil.charting.renderer.scatter.SquareShapeRenderer;
import com.github.mikephil.charting.renderer.scatter.TriangleShapeRenderer;
import com.github.mikephil.charting.renderer.scatter.XShapeRenderer;
import java.util.HashMap;
/**
* Created by Philipp Jahoda on 27/06/16.
*/
public final class ShapeRendererHandler {
/**
* Dictionary of ShapeRenderer which are responsible for drawing custom shapes.
* Can add to it your custom shapes.
* CustomShapeRenderer Implements ShapeRenderer{}
*/
protected HashMap<String, ShapeRenderer> shapeRendererList;
/**
* Constructor
*/
public ShapeRendererHandler() {
initShapeRenderers();
}
/**
* Returns the corresponding ShapeRenderer for a given ScatterShape.
*
* @param shape
* @return
*/
public ShapeRenderer getShapeRenderer(ScatterChart.ScatterShape shape) {
return shapeRendererList.get(shape.toString());
}
/**
* Init default ShapeRenderers.
*/
protected void initShapeRenderers() {
shapeRendererList = new HashMap<>();
shapeRendererList.put(ScatterChart.ScatterShape.SQUARE.toString(), new SquareShapeRenderer());
shapeRendererList.put(ScatterChart.ScatterShape.CIRCLE.toString(), new CircleShapeRenderer());
shapeRendererList.put(ScatterChart.ScatterShape.TRIANGLE.toString(), new TriangleShapeRenderer());
shapeRendererList.put(ScatterChart.ScatterShape.CROSS.toString(), new CrossShapeRenderer());
shapeRendererList.put(ScatterChart.ScatterShape.X.toString(), new XShapeRenderer());
shapeRendererList.put(ScatterChart.ScatterShape.CHEVRON_UP.toString(), new ChevronUpShapeRenderer());
shapeRendererList.put(ScatterChart.ScatterShape.CHEVRON_DOWN.toString(), new ChevronDownShapeRenderer());
}
}