DRYed scatter code, simplified IShapeRenderer implementations

This commit is contained in:
Daniel Cohen Gindi 2016-08-08 22:15:57 +03:00
parent 51f0e53a7f
commit aaec1f5d2c
11 changed files with 188 additions and 316 deletions

View file

@ -3,7 +3,6 @@ package com.xxmassdeveloper.mpchartexample.custom;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.github.mikephil.charting.buffer.ScatterBuffer;
import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
import com.github.mikephil.charting.renderer.scatter.IShapeRenderer;
import com.github.mikephil.charting.utils.ViewPortHandler;
@ -16,28 +15,16 @@ public class CustomScatterShapeRenderer implements IShapeRenderer
{
@Override
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
renderPaint, float shapeSize) {
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler,
float posX, float posY, Paint renderPaint) {
final float shapeHalf = shapeSize / 2f;
final float shapeHalf = dataSet.getScatterShapeSize() / 2f;
for (int i = 0; i < buffer.size(); i += 2) {
if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
break;
if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
|| !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
continue;
renderPaint.setColor(dataSet.getColor(i / 2));
c.drawLine(
buffer.buffer[i] - shapeHalf,
buffer.buffer[i + 1] - shapeHalf,
buffer.buffer[i] + shapeHalf,
buffer.buffer[i + 1] + shapeHalf,
renderPaint);
}
c.drawLine(
posX - shapeHalf,
posY - shapeHalf,
posX + shapeHalf,
posY + shapeHalf,
renderPaint);
}
}

View file

@ -1,31 +0,0 @@
package com.github.mikephil.charting.buffer;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
public class ScatterBuffer extends AbstractBuffer<IScatterDataSet> {
public ScatterBuffer(int size) {
super(size);
}
protected void addForm(float x, float y) {
buffer[index++] = x;
buffer[index++] = y;
}
@Override
public void feed(IScatterDataSet data) {
float size = data.getEntryCount() * phaseX;
for (int i = 0; i < size; i++) {
Entry e = data.getEntryForIndex(i);
addForm(e.getX(), e.getY() * phaseY);
}
reset();
}
}

View file

@ -2,9 +2,9 @@
package com.github.mikephil.charting.renderer;
import android.graphics.Canvas;
import android.util.Log;
import com.github.mikephil.charting.animation.ChartAnimator;
import com.github.mikephil.charting.buffer.ScatterBuffer;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.ScatterData;
import com.github.mikephil.charting.highlight.Highlight;
@ -22,8 +22,6 @@ public class ScatterChartRenderer extends LineScatterCandleRadarRenderer {
protected ScatterDataProvider mChart;
protected ScatterBuffer[] mScatterBuffers;
public ScatterChartRenderer(ScatterDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler) {
super(animator, viewPortHandler);
mChart = chart;
@ -31,15 +29,6 @@ public class ScatterChartRenderer extends LineScatterCandleRadarRenderer {
@Override
public void initBuffers() {
ScatterData scatterData = mChart.getScatterData();
mScatterBuffers = new ScatterBuffer[scatterData.getDataSetCount()];
for (int i = 0; i < mScatterBuffers.length; i++) {
IScatterDataSet set = scatterData.getDataSetByIndex(i);
mScatterBuffers[i] = new ScatterBuffer(set.getEntryCount() * 2);
}
}
@Override
@ -57,28 +46,47 @@ public class ScatterChartRenderer extends LineScatterCandleRadarRenderer {
}
}
float[] mPixelBuffer = new float[2];
protected void drawDataSet(Canvas c, IScatterDataSet dataSet) {
ViewPortHandler viewPortHandler = mViewPortHandler;
Transformer trans = mChart.getTransformer(dataSet.getAxisDependency());
float phaseX = Math.max(0.f, Math.min(1.f, mAnimator.getPhaseX()));
float phaseY = mAnimator.getPhaseY();
final float shapeSize = Utils.convertDpToPixel(dataSet.getScatterShapeSize());
ScatterBuffer buffer = mScatterBuffers[mChart.getScatterData().getIndexOfDataSet(dataSet)];
buffer.setPhases(phaseX, phaseY);
buffer.feed(dataSet);
trans.pointValuesToPixel(buffer.buffer);
IShapeRenderer renderer = dataSet.getShapeRenderer();
if (renderer == null) {
Log.i("MISSING", "There's no IShapeRenderer specified for ScatterDataSet");
return;
}
if (renderer != null) {
renderer.renderShape(c, dataSet, mViewPortHandler, buffer, mRenderPaint, shapeSize);
} else {
throw new RuntimeException("No IShapeRenderer found for provided identifier. Please make sure to add a IShapeRenderer" +
" capable of rendering the provided shape.");
int max = (int)(Math.min(
Math.ceil((float)dataSet.getEntryCount() * mAnimator.getPhaseX()),
(float)dataSet.getEntryCount()));
for (int i = 0; i < max; i++) {
Entry e = dataSet.getEntryForIndex(i);
mPixelBuffer[0] = e.getX();
mPixelBuffer[1] = e.getY() * phaseY;
trans.pointValuesToPixel(mPixelBuffer);
if (!viewPortHandler.isInBoundsRight(mPixelBuffer[0]))
break;
if (!viewPortHandler.isInBoundsLeft(mPixelBuffer[0])
|| !viewPortHandler.isInBoundsY(mPixelBuffer[1]))
continue;
mRenderPaint.setColor(dataSet.getColor(i / 2));
renderer.renderShape(
c, dataSet, mViewPortHandler,
mPixelBuffer[0], mPixelBuffer[1],
mRenderPaint);
}
}

View file

@ -3,7 +3,6 @@ package com.github.mikephil.charting.renderer.scatter;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.github.mikephil.charting.buffer.ScatterBuffer;
import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
import com.github.mikephil.charting.utils.Utils;
import com.github.mikephil.charting.utils.ViewPortHandler;
@ -17,39 +16,26 @@ public class ChevronDownShapeRenderer implements IShapeRenderer
@Override
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
renderPaint, final float shapeSize) {
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler,
float posX, float posY, Paint renderPaint) {
final float shapeHalf = shapeSize / 2f;
final float shapeHalf = dataSet.getScatterShapeSize() / 2f;
renderPaint.setStyle(Paint.Style.STROKE);
renderPaint.setStrokeWidth(Utils.convertDpToPixel(1f));
for (int i = 0; i < buffer.size(); i += 2) {
if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
break;
if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
|| !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
continue;
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],
renderPaint);
c.drawLine(
buffer.buffer[i],
buffer.buffer[i + 1] + (2 * shapeHalf),
buffer.buffer[i] - (2 * shapeHalf),
buffer.buffer[i + 1],
renderPaint);
}
c.drawLine(
posX,
posY + (2 * shapeHalf),
posX + (2 * shapeHalf),
posY,
renderPaint);
c.drawLine(
posX,
posY + (2 * shapeHalf),
posX - (2 * shapeHalf),
posY,
renderPaint);
}
}

View file

@ -3,7 +3,6 @@ package com.github.mikephil.charting.renderer.scatter;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.github.mikephil.charting.buffer.ScatterBuffer;
import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
import com.github.mikephil.charting.utils.Utils;
import com.github.mikephil.charting.utils.ViewPortHandler;
@ -17,39 +16,27 @@ public class ChevronUpShapeRenderer implements IShapeRenderer
@Override
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
renderPaint, final float shapeSize) {
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler,
float posX, float posY, Paint renderPaint) {
final float shapeHalf = shapeSize / 2f;
final float shapeHalf = dataSet.getScatterShapeSize() / 2f;
renderPaint.setStyle(Paint.Style.STROKE);
renderPaint.setStrokeWidth(Utils.convertDpToPixel(1f));
for (int i = 0; i < buffer.size(); i += 2) {
c.drawLine(
posX,
posY - (2 * shapeHalf),
posX + (2 * shapeHalf),
posY,
renderPaint);
if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
break;
if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
|| !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
continue;
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],
renderPaint);
c.drawLine(
buffer.buffer[i],
buffer.buffer[i + 1] - (2 * shapeHalf),
buffer.buffer[i] - (2 * shapeHalf),
buffer.buffer[i + 1],
renderPaint);
}
c.drawLine(
posX,
posY - (2 * shapeHalf),
posX - (2 * shapeHalf),
posY,
renderPaint);
}
}

View file

@ -3,7 +3,6 @@ package com.github.mikephil.charting.renderer.scatter;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.github.mikephil.charting.buffer.ScatterBuffer;
import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
import com.github.mikephil.charting.utils.ColorTemplate;
import com.github.mikephil.charting.utils.Utils;
@ -17,9 +16,10 @@ public class CircleShapeRenderer implements IShapeRenderer
{
@Override
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
renderPaint, final float shapeSize) {
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler,
float posX, float posY, Paint renderPaint) {
final float shapeSize = dataSet.getScatterShapeSize();
final float shapeHalf = shapeSize / 2f;
final float shapeHoleSizeHalf = Utils.convertDpToPixel(dataSet.getScatterShapeHoleRadius());
final float shapeHoleSize = shapeHoleSizeHalf * 2.f;
@ -28,46 +28,34 @@ public class CircleShapeRenderer implements IShapeRenderer
final int shapeHoleColor = dataSet.getScatterShapeHoleColor();
for (int i = 0; i < buffer.size(); i += 2) {
if (shapeSize > 0.0) {
renderPaint.setStyle(Paint.Style.STROKE);
renderPaint.setStrokeWidth(shapeStrokeSize);
if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
break;
c.drawCircle(
posX,
posY,
shapeHoleSizeHalf + shapeStrokeSizeHalf,
renderPaint);
if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
|| !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
continue;
renderPaint.setColor(dataSet.getColor(i / 2));
if (shapeSize > 0.0) {
renderPaint.setStyle(Paint.Style.STROKE);
renderPaint.setStrokeWidth(shapeStrokeSize);
c.drawCircle(
buffer.buffer[i],
buffer.buffer[i + 1],
shapeHoleSizeHalf + shapeStrokeSizeHalf,
renderPaint);
if (shapeHoleColor != ColorTemplate.COLOR_NONE) {
renderPaint.setStyle(Paint.Style.FILL);
renderPaint.setColor(shapeHoleColor);
c.drawCircle(
buffer.buffer[i],
buffer.buffer[i + 1],
shapeHoleSizeHalf,
renderPaint);
}
} else {
if (shapeHoleColor != ColorTemplate.COLOR_NONE) {
renderPaint.setStyle(Paint.Style.FILL);
renderPaint.setColor(shapeHoleColor);
c.drawCircle(
buffer.buffer[i],
buffer.buffer[i + 1],
shapeHalf,
posX,
posY,
shapeHoleSizeHalf,
renderPaint);
}
} else {
renderPaint.setStyle(Paint.Style.FILL);
c.drawCircle(
posX,
posY,
shapeHalf,
renderPaint);
}
}

View file

@ -3,7 +3,6 @@ package com.github.mikephil.charting.renderer.scatter;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.github.mikephil.charting.buffer.ScatterBuffer;
import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
import com.github.mikephil.charting.utils.Utils;
import com.github.mikephil.charting.utils.ViewPortHandler;
@ -17,39 +16,26 @@ public class CrossShapeRenderer implements IShapeRenderer
@Override
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
renderPaint, final float shapeSize) {
final float shapeHalf = shapeSize / 2f;
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler,
float posX, float posY, Paint renderPaint) {
final float shapeHalf = dataSet.getScatterShapeSize() / 2f;
renderPaint.setStyle(Paint.Style.STROKE);
renderPaint.setStrokeWidth(Utils.convertDpToPixel(1f));
for (int i = 0; i < buffer.size(); i += 2) {
if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
break;
if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
|| !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
continue;
renderPaint.setColor(dataSet.getColor(i / 2));
c.drawLine(
buffer.buffer[i] - shapeHalf,
buffer.buffer[i + 1],
buffer.buffer[i] + shapeHalf,
buffer.buffer[i + 1],
renderPaint);
c.drawLine(
buffer.buffer[i],
buffer.buffer[i + 1] - shapeHalf,
buffer.buffer[i],
buffer.buffer[i + 1] + shapeHalf,
renderPaint);
}
c.drawLine(
posX - shapeHalf,
posY,
posX + shapeHalf,
posY,
renderPaint);
c.drawLine(
posX,
posY - shapeHalf,
posX,
posY + shapeHalf,
renderPaint);
}
}

View file

@ -3,8 +3,6 @@ package com.github.mikephil.charting.renderer.scatter;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.github.mikephil.charting.buffer.ScatterBuffer;
import com.github.mikephil.charting.charts.ScatterChart;
import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
import com.github.mikephil.charting.utils.ViewPortHandler;
@ -19,12 +17,12 @@ public interface IShapeRenderer
* Renders the provided ScatterDataSet with a shape.
*
* @param c Canvas object for drawing the shape
* @param dataSet the DataSet to be drawn
* @param viewPortHandler contains information about the current state of the view
* @param buffer buffer containing the transformed values of all entries in the DataSet
* @param dataSet The DataSet to be drawn
* @param viewPortHandler Contains information about the current state of the view
* @param posX Position to draw the shape at
* @param posY Position to draw the shape at
* @param renderPaint Paint object used for styling and drawing
* @param shapeSize
*/
void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
renderPaint, final float shapeSize);
void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler,
float posX, float posY, Paint renderPaint);
}

View file

@ -3,7 +3,6 @@ package com.github.mikephil.charting.renderer.scatter;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.github.mikephil.charting.buffer.ScatterBuffer;
import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
import com.github.mikephil.charting.utils.ColorTemplate;
import com.github.mikephil.charting.utils.Utils;
@ -18,9 +17,10 @@ public class SquareShapeRenderer implements IShapeRenderer
@Override
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
renderPaint, final float shapeSize) {
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler,
float posX, float posY, Paint renderPaint) {
final float shapeSize = dataSet.getScatterShapeSize();
final float shapeHalf = shapeSize / 2f;
final float shapeHoleSizeHalf = Utils.convertDpToPixel(dataSet.getScatterShapeHoleRadius());
final float shapeHoleSize = shapeHoleSizeHalf * 2.f;
@ -29,47 +29,35 @@ public class SquareShapeRenderer implements IShapeRenderer
final int shapeHoleColor = dataSet.getScatterShapeHoleColor();
for (int i = 0; i < buffer.size(); i += 2) {
if (shapeSize > 0.0) {
renderPaint.setStyle(Paint.Style.STROKE);
renderPaint.setStrokeWidth(shapeStrokeSize);
if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
break;
c.drawRect(posX - shapeHoleSizeHalf - shapeStrokeSizeHalf,
posY - shapeHoleSizeHalf - shapeStrokeSizeHalf,
posX + shapeHoleSizeHalf + shapeStrokeSizeHalf,
posY + shapeHoleSizeHalf + shapeStrokeSizeHalf,
renderPaint);
if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
|| !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
continue;
renderPaint.setColor(dataSet.getColor(i / 2));
if (shapeSize > 0.0) {
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,
renderPaint);
if (shapeHoleColor != ColorTemplate.COLOR_NONE) {
renderPaint.setStyle(Paint.Style.FILL);
renderPaint.setColor(shapeHoleColor);
c.drawRect(buffer.buffer[i] - shapeHoleSizeHalf,
buffer.buffer[i + 1] - shapeHoleSizeHalf,
buffer.buffer[i] + shapeHoleSizeHalf,
buffer.buffer[i + 1] + shapeHoleSizeHalf,
renderPaint);
}
} else {
if (shapeHoleColor != ColorTemplate.COLOR_NONE) {
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,
renderPaint.setColor(shapeHoleColor);
c.drawRect(posX - shapeHoleSizeHalf,
posY - shapeHoleSizeHalf,
posX + shapeHoleSizeHalf,
posY + shapeHoleSizeHalf,
renderPaint);
}
} else {
renderPaint.setStyle(Paint.Style.FILL);
c.drawRect(posX - shapeHalf,
posY - shapeHalf,
posX + shapeHalf,
posY + shapeHalf,
renderPaint);
}
}
}

View file

@ -4,7 +4,6 @@ import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import com.github.mikephil.charting.buffer.ScatterBuffer;
import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
import com.github.mikephil.charting.utils.ColorTemplate;
import com.github.mikephil.charting.utils.Utils;
@ -20,9 +19,10 @@ public class TriangleShapeRenderer implements IShapeRenderer
protected Path mTrianglePathBuffer = new Path();
@Override
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
renderPaint, final float shapeSize) {
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler,
float posX, float posY, Paint renderPaint) {
final float shapeSize = dataSet.getScatterShapeSize();
final float shapeHalf = shapeSize / 2f;
final float shapeHoleSizeHalf = Utils.convertDpToPixel(dataSet.getScatterShapeHoleRadius());
final float shapeHoleSize = shapeHoleSizeHalf * 2.f;
@ -36,55 +36,43 @@ public class TriangleShapeRenderer implements IShapeRenderer
Path tri = mTrianglePathBuffer;
tri.reset();
for (int i = 0; i < buffer.size(); i += 2) {
tri.moveTo(posX, posY - shapeHalf);
tri.lineTo(posX + shapeHalf, posY + shapeHalf);
tri.lineTo(posX - shapeHalf, posY + shapeHalf);
if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
break;
if (shapeSize > 0.0) {
tri.lineTo(posX, posY - shapeHalf);
if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
|| !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
continue;
tri.moveTo(posX - shapeHalf + shapeStrokeSize,
posY + shapeHalf - shapeStrokeSize);
tri.lineTo(posX + shapeHalf - shapeStrokeSize,
posY + shapeHalf - shapeStrokeSize);
tri.lineTo(posX,
posY - shapeHalf + shapeStrokeSize);
tri.lineTo(posX - shapeHalf + shapeStrokeSize,
posY + shapeHalf - shapeStrokeSize);
}
renderPaint.setColor(dataSet.getColor(i / 2));
tri.close();
tri.moveTo(buffer.buffer[i], buffer.buffer[i + 1] - shapeHalf);
tri.lineTo(buffer.buffer[i] + shapeHalf, buffer.buffer[i + 1] + shapeHalf);
tri.lineTo(buffer.buffer[i] - shapeHalf, buffer.buffer[i + 1] + shapeHalf);
c.drawPath(tri, renderPaint);
tri.reset();
if (shapeSize > 0.0) {
tri.lineTo(buffer.buffer[i], buffer.buffer[i + 1] - shapeHalf);
if (shapeSize > 0.0 &&
shapeHoleColor != ColorTemplate.COLOR_NONE) {
tri.moveTo(buffer.buffer[i] - shapeHalf + shapeStrokeSize,
buffer.buffer[i + 1] + shapeHalf - shapeStrokeSize);
tri.lineTo(buffer.buffer[i] + shapeHalf - shapeStrokeSize,
buffer.buffer[i + 1] + shapeHalf - shapeStrokeSize);
tri.lineTo(buffer.buffer[i],
buffer.buffer[i + 1] - shapeHalf + shapeStrokeSize);
tri.lineTo(buffer.buffer[i] - shapeHalf + shapeStrokeSize,
buffer.buffer[i + 1] + shapeHalf - shapeStrokeSize);
}
renderPaint.setColor(shapeHoleColor);
tri.moveTo(posX,
posY - shapeHalf + shapeStrokeSize);
tri.lineTo(posX + shapeHalf - shapeStrokeSize,
posY + shapeHalf - shapeStrokeSize);
tri.lineTo(posX - shapeHalf + shapeStrokeSize,
posY + shapeHalf - shapeStrokeSize);
tri.close();
c.drawPath(tri, renderPaint);
tri.reset();
if (shapeSize > 0.0 &&
shapeHoleColor != ColorTemplate.COLOR_NONE) {
renderPaint.setColor(shapeHoleColor);
tri.moveTo(buffer.buffer[i],
buffer.buffer[i + 1] - shapeHalf + shapeStrokeSize);
tri.lineTo(buffer.buffer[i] + shapeHalf - shapeStrokeSize,
buffer.buffer[i + 1] + shapeHalf - shapeStrokeSize);
tri.lineTo(buffer.buffer[i] - shapeHalf + shapeStrokeSize,
buffer.buffer[i + 1] + shapeHalf - shapeStrokeSize);
tri.close();
c.drawPath(tri, renderPaint);
tri.reset();
}
}
}

View file

@ -3,7 +3,6 @@ package com.github.mikephil.charting.renderer.scatter;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.github.mikephil.charting.buffer.ScatterBuffer;
import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
import com.github.mikephil.charting.utils.Utils;
import com.github.mikephil.charting.utils.ViewPortHandler;
@ -17,38 +16,26 @@ public class XShapeRenderer implements IShapeRenderer
@Override
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
renderPaint, final float shapeSize) {
public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler,
float posX, float posY, Paint renderPaint) {
final float shapeHalf = shapeSize / 2f;
final float shapeHalf = dataSet.getScatterShapeSize() / 2f;
renderPaint.setStyle(Paint.Style.STROKE);
renderPaint.setStrokeWidth(Utils.convertDpToPixel(1f));
for (int i = 0; i < buffer.size(); i += 2) {
if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
break;
if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
|| !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
continue;
renderPaint.setColor(dataSet.getColor(i / 2));
c.drawLine(
buffer.buffer[i] - shapeHalf,
buffer.buffer[i + 1] - shapeHalf,
buffer.buffer[i] + shapeHalf,
buffer.buffer[i + 1] + shapeHalf,
renderPaint);
c.drawLine(
buffer.buffer[i] + shapeHalf,
buffer.buffer[i + 1] - shapeHalf,
buffer.buffer[i] - shapeHalf,
buffer.buffer[i + 1] + shapeHalf,
renderPaint);
}
c.drawLine(
posX - shapeHalf,
posY - shapeHalf,
posX + shapeHalf,
posY + shapeHalf,
renderPaint);
c.drawLine(
posX + shapeHalf,
posY - shapeHalf,
posX - shapeHalf,
posY + shapeHalf,
renderPaint);
}