Java Code Examples for com.github.mikephil.charting.interfaces.datasets.ILineDataSet#getEntryForXIndex()
The following examples show how to use
com.github.mikephil.charting.interfaces.datasets.ILineDataSet#getEntryForXIndex() .
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: LineChartRenderer.java From Stayfit with Apache License 2.0 | 4 votes |
/** * Draws a normal line. * * @param c * @param dataSet */ protected void drawLinear(Canvas c, ILineDataSet dataSet) { int entryCount = dataSet.getEntryCount(); int dataSetIndex = mChart.getLineData().getIndexOfDataSet(dataSet); Transformer trans = mChart.getTransformer(dataSet.getAxisDependency()); float phaseX = mAnimator.getPhaseX(); float phaseY = mAnimator.getPhaseY(); mRenderPaint.setStyle(Paint.Style.STROKE); Canvas canvas = null; // if the data-set is dashed, draw on bitmap-canvas if (dataSet.isDashedLineEnabled()) { canvas = mBitmapCanvas; } else { canvas = c; } Entry entryFrom = dataSet.getEntryForXIndex((mMinX < 0) ? 0 : mMinX, DataSet.Rounding.DOWN); Entry entryTo = dataSet.getEntryForXIndex(mMaxX, DataSet.Rounding.UP); int minx = Math.max(dataSet.getEntryIndex(entryFrom), 0); int maxx = Math.min(dataSet.getEntryIndex(entryTo) + 1, entryCount); int range = (maxx - minx) * 4 - 4; LineBuffer buffer = mLineBuffers[dataSetIndex]; buffer.setPhases(phaseX, phaseY); buffer.limitFrom(minx); buffer.limitTo(maxx); buffer.feed(dataSet); trans.pointValuesToPixel(buffer.buffer); // more than 1 color if (dataSet.getColors().size() > 1) { for (int j = 0; j < range; j += 4) { if (!mViewPortHandler.isInBoundsRight(buffer.buffer[j])) break; // make sure the lines don't do shitty things outside // bounds if (!mViewPortHandler.isInBoundsLeft(buffer.buffer[j + 2]) || (!mViewPortHandler.isInBoundsTop(buffer.buffer[j + 1]) && !mViewPortHandler .isInBoundsBottom(buffer.buffer[j + 3])) || (!mViewPortHandler.isInBoundsTop(buffer.buffer[j + 1]) && !mViewPortHandler .isInBoundsBottom(buffer.buffer[j + 3]))) continue; // get the color that is set for this line-segment mRenderPaint.setColor(dataSet.getColor(j / 4 + minx)); canvas.drawLine(buffer.buffer[j], buffer.buffer[j + 1], buffer.buffer[j + 2], buffer.buffer[j + 3], mRenderPaint); } } else { // only one color per dataset mRenderPaint.setColor(dataSet.getColor()); // c.drawLines(buffer.buffer, mRenderPaint); canvas.drawLines(buffer.buffer, 0, range, mRenderPaint); } mRenderPaint.setPathEffect(null); // if drawing filled is enabled if (dataSet.isDrawFilledEnabled() && entryCount > 0) { drawLinearFill(c, dataSet, minx, maxx, trans); } }
Example 2
Source File: DynamicalAddingActivity.java From Stayfit with Apache License 2.0 | 4 votes |
private void removeLastEntry() { LineData data = mChart.getData(); if(data != null) { ILineDataSet set = data.getDataSetByIndex(0); if (set != null) { Entry e = set.getEntryForXIndex(set.getEntryCount() - 1); data.removeEntry(e, 0); // or remove by index // mData.removeEntry(xIndex, dataSetIndex); mChart.notifyDataSetChanged(); mChart.invalidate(); } } }
Example 3
Source File: LineChartRenderer.java From NetKnight with Apache License 2.0 | 4 votes |
protected void drawCubicBezier(Canvas c, ILineDataSet dataSet) { Transformer trans = mChart.getTransformer(dataSet.getAxisDependency()); int entryCount = dataSet.getEntryCount(); Entry entryFrom = dataSet.getEntryForXIndex((mMinX < 0) ? 0 : mMinX, DataSet.Rounding.DOWN); Entry entryTo = dataSet.getEntryForXIndex(mMaxX, DataSet.Rounding.UP); int diff = (entryFrom == entryTo) ? 1 : 0; int minx = Math.max(dataSet.getEntryIndex(entryFrom) - diff - 1, 0); int maxx = Math.min(Math.max(minx + 2, dataSet.getEntryIndex(entryTo) + 1), entryCount); float phaseX = Math.max(0.f, Math.min(1.f, mAnimator.getPhaseX())); float phaseY = mAnimator.getPhaseY(); float intensity = dataSet.getCubicIntensity(); cubicPath.reset(); int size = (int) Math.ceil((maxx - minx) * phaseX + minx); if (size - minx >= 2) { float prevDx = 0f; float prevDy = 0f; float curDx = 0f; float curDy = 0f; Entry prevPrev = dataSet.getEntryForIndex(minx); Entry prev = prevPrev; Entry cur = prev; Entry next = dataSet.getEntryForIndex(minx + 1); // let the spline start cubicPath.moveTo(cur.getXIndex(), cur.getVal() * phaseY); for (int j = minx + 1, count = Math.min(size, entryCount); j < count; j++) { prevPrev = dataSet.getEntryForIndex(j == 1 ? 0 : j - 2); prev = dataSet.getEntryForIndex(j - 1); cur = dataSet.getEntryForIndex(j); next = entryCount > j + 1 ? dataSet.getEntryForIndex(j + 1) : cur; prevDx = (cur.getXIndex() - prevPrev.getXIndex()) * intensity; prevDy = (cur.getVal() - prevPrev.getVal()) * intensity; curDx = (next.getXIndex() - prev.getXIndex()) * intensity; curDy = (next.getVal() - prev.getVal()) * intensity; cubicPath.cubicTo(prev.getXIndex() + prevDx, (prev.getVal() + prevDy) * phaseY, cur.getXIndex() - curDx, (cur.getVal() - curDy) * phaseY, cur.getXIndex(), cur.getVal() * phaseY); } } // if filled is enabled, close the path if (dataSet.isDrawFilledEnabled()) { cubicFillPath.reset(); cubicFillPath.addPath(cubicPath); // create a new path, this is bad for performance drawCubicFill(mBitmapCanvas, dataSet, cubicFillPath, trans, minx, size); } mRenderPaint.setColor(dataSet.getColor()); mRenderPaint.setStyle(Paint.Style.STROKE); trans.pathValueToPixel(cubicPath); mBitmapCanvas.drawPath(cubicPath, mRenderPaint); mRenderPaint.setPathEffect(null); }
Example 4
Source File: LineChartRenderer.java From NetKnight with Apache License 2.0 | 4 votes |
protected void drawCircles(Canvas c) { mRenderPaint.setStyle(Paint.Style.FILL); float phaseX = Math.max(0.f, Math.min(1.f, mAnimator.getPhaseX())); float phaseY = mAnimator.getPhaseY(); float[] circlesBuffer = new float[2]; List<ILineDataSet> dataSets = mChart.getLineData().getDataSets(); for (int i = 0; i < dataSets.size(); i++) { ILineDataSet dataSet = dataSets.get(i); if (!dataSet.isVisible() || !dataSet.isDrawCirclesEnabled() || dataSet.getEntryCount() == 0) continue; mCirclePaintInner.setColor(dataSet.getCircleHoleColor()); Transformer trans = mChart.getTransformer(dataSet.getAxisDependency()); int entryCount = dataSet.getEntryCount(); Entry entryFrom = dataSet.getEntryForXIndex((mMinX < 0) ? 0 : mMinX, DataSet.Rounding.DOWN); Entry entryTo = dataSet.getEntryForXIndex(mMaxX, DataSet.Rounding.UP); int diff = (entryFrom == entryTo) ? 1 : 0; if (dataSet.getMode() == LineDataSet.Mode.CUBIC_BEZIER) diff += 1; int minx = Math.max(dataSet.getEntryIndex(entryFrom) - diff, 0); int maxx = Math.min(Math.max(minx + 2, dataSet.getEntryIndex(entryTo) + 1), entryCount); float circleRadius = dataSet.getCircleRadius(); float circleHoleRadius = dataSet.getCircleHoleRadius(); boolean drawCircleHole = dataSet.isDrawCircleHoleEnabled() && circleHoleRadius < circleRadius && circleHoleRadius > 0.f; boolean drawTransparentCircleHole = drawCircleHole && dataSet.getCircleHoleColor() == ColorTemplate.COLOR_NONE; for (int j = minx, count = (int) Math.ceil((maxx - minx) * phaseX + minx); j < count; j ++) { Entry e = dataSet.getEntryForIndex(j); if (e == null) break; circlesBuffer[0] = e.getXIndex(); circlesBuffer[1] = e.getVal() * phaseY; trans.pointValuesToPixel(circlesBuffer); if (!mViewPortHandler.isInBoundsRight(circlesBuffer[0])) break; // make sure the circles don't do shitty things outside // bounds if (!mViewPortHandler.isInBoundsLeft(circlesBuffer[0]) || !mViewPortHandler.isInBoundsY(circlesBuffer[1])) continue; mRenderPaint.setColor(dataSet.getCircleColor(j)); if (drawTransparentCircleHole) { // Begin path for circle with hole mCirclePathBuffer.reset(); mCirclePathBuffer.addCircle(circlesBuffer[0], circlesBuffer[1], circleRadius, Path.Direction.CW); // Cut hole in path mCirclePathBuffer.addCircle(circlesBuffer[0], circlesBuffer[1], circleHoleRadius, Path.Direction.CCW); // Fill in-between c.drawPath(mCirclePathBuffer, mRenderPaint); } else { c.drawCircle(circlesBuffer[0], circlesBuffer[1], circleRadius, mRenderPaint); if (drawCircleHole) { c.drawCircle(circlesBuffer[0], circlesBuffer[1], circleHoleRadius, mCirclePaintInner); } } } } }
Example 5
Source File: LineChartRenderer.java From Stayfit with Apache License 2.0 | 2 votes |
@Override public void drawValues(Canvas c) { if (mChart.getLineData().getYValCount() < mChart.getMaxVisibleCount() * mViewPortHandler.getScaleX()) { List<ILineDataSet> dataSets = mChart.getLineData().getDataSets(); for (int i = 0; i < dataSets.size(); i++) { ILineDataSet dataSet = dataSets.get(i); if (!dataSet.isDrawValuesEnabled() || dataSet.getEntryCount() == 0) continue; // apply the text-styling defined by the DataSet applyValueTextStyle(dataSet); Transformer trans = mChart.getTransformer(dataSet.getAxisDependency()); // make sure the values do not interfear with the circles int valOffset = (int) (dataSet.getCircleRadius() * 1.75f); if (!dataSet.isDrawCirclesEnabled()) valOffset = valOffset / 2; int entryCount = dataSet.getEntryCount(); Entry entryFrom = dataSet.getEntryForXIndex((mMinX < 0) ? 0 : mMinX, DataSet.Rounding.DOWN); Entry entryTo = dataSet.getEntryForXIndex(mMaxX, DataSet.Rounding.UP); int minx = Math.max(dataSet.getEntryIndex(entryFrom), 0); int maxx = Math.min(dataSet.getEntryIndex(entryTo) + 1, entryCount); float[] positions = trans.generateTransformedValuesLine( dataSet, mAnimator.getPhaseX(), mAnimator.getPhaseY(), minx, maxx); for (int j = 0; j < positions.length; j += 2) { float x = positions[j]; float y = positions[j + 1]; if (!mViewPortHandler.isInBoundsRight(x)) break; if (!mViewPortHandler.isInBoundsLeft(x) || !mViewPortHandler.isInBoundsY(y)) continue; Entry entry = dataSet.getEntryForIndex(j / 2 + minx); drawValue(c, dataSet.getValueFormatter(), entry.getVal(), entry, i, x, y - valOffset, dataSet.getValueTextColor(j / 2)); } } } }
Example 6
Source File: LineChartRenderer.java From Stayfit with Apache License 2.0 | 2 votes |
protected void drawCircles(Canvas c) { mRenderPaint.setStyle(Paint.Style.FILL); float phaseX = mAnimator.getPhaseX(); float phaseY = mAnimator.getPhaseY(); List<ILineDataSet> dataSets = mChart.getLineData().getDataSets(); for (int i = 0; i < dataSets.size(); i++) { ILineDataSet dataSet = dataSets.get(i); if (!dataSet.isVisible() || !dataSet.isDrawCirclesEnabled() || dataSet.getEntryCount() == 0) continue; mCirclePaintInner.setColor(dataSet.getCircleHoleColor()); Transformer trans = mChart.getTransformer(dataSet.getAxisDependency()); int entryCount = dataSet.getEntryCount(); Entry entryFrom = dataSet.getEntryForXIndex((mMinX < 0) ? 0 : mMinX, DataSet.Rounding.DOWN); Entry entryTo = dataSet.getEntryForXIndex(mMaxX, DataSet.Rounding.UP); int minx = Math.max(dataSet.getEntryIndex(entryFrom), 0); int maxx = Math.min(dataSet.getEntryIndex(entryTo) + 1, entryCount); CircleBuffer buffer = mCircleBuffers[i]; buffer.setPhases(phaseX, phaseY); buffer.limitFrom(minx); buffer.limitTo(maxx); buffer.feed(dataSet); trans.pointValuesToPixel(buffer.buffer); float halfsize = dataSet.getCircleRadius() / 2f; for (int j = 0, count = (int) Math.ceil((maxx - minx) * phaseX + minx) * 2; j < count; j += 2) { float x = buffer.buffer[j]; float y = buffer.buffer[j + 1]; if (!mViewPortHandler.isInBoundsRight(x)) break; // make sure the circles don't do shitty things outside // bounds if (!mViewPortHandler.isInBoundsLeft(x) || !mViewPortHandler.isInBoundsY(y)) continue; int circleColor = dataSet.getCircleColor(j / 2 + minx); mRenderPaint.setColor(circleColor); c.drawCircle(x, y, dataSet.getCircleRadius(), mRenderPaint); if (dataSet.isDrawCircleHoleEnabled() && circleColor != mCirclePaintInner.getColor()) c.drawCircle(x, y, halfsize, mCirclePaintInner); } } }
Example 7
Source File: LineChartRenderer.java From NetKnight with Apache License 2.0 | 2 votes |
/** * Draws a cubic line. * * @param c * @param dataSet */ protected void drawHorizontalBezier(Canvas c, ILineDataSet dataSet) { Transformer trans = mChart.getTransformer(dataSet.getAxisDependency()); int entryCount = dataSet.getEntryCount(); Entry entryFrom = dataSet.getEntryForXIndex((mMinX < 0) ? 0 : mMinX, DataSet.Rounding.DOWN); Entry entryTo = dataSet.getEntryForXIndex(mMaxX, DataSet.Rounding.UP); int diff = (entryFrom == entryTo) ? 1 : 0; int minx = Math.max(dataSet.getEntryIndex(entryFrom) - diff, 0); int maxx = Math.min(Math.max(minx + 2, dataSet.getEntryIndex(entryTo) + 1), entryCount); float phaseX = Math.max(0.f, Math.min(1.f, mAnimator.getPhaseX())); float phaseY = mAnimator.getPhaseY(); cubicPath.reset(); int size = (int) Math.ceil((maxx - minx) * phaseX + minx); if (size - minx >= 2) { Entry prev = dataSet.getEntryForIndex(minx); Entry cur = prev; // let the spline start cubicPath.moveTo(cur.getXIndex(), cur.getVal() * phaseY); for (int j = minx + 1, count = Math.min(size, entryCount); j < count; j++) { prev = dataSet.getEntryForIndex(j - 1); cur = dataSet.getEntryForIndex(j); final float cpx = (float)(prev.getXIndex()) + (float)(cur.getXIndex() - prev.getXIndex()) / 2.0f; cubicPath.cubicTo( cpx, prev.getVal() * phaseY, cpx, cur.getVal() * phaseY, cur.getXIndex(), cur.getVal() * phaseY); } } // if filled is enabled, close the path if (dataSet.isDrawFilledEnabled()) { cubicFillPath.reset(); cubicFillPath.addPath(cubicPath); // create a new path, this is bad for performance drawCubicFill(mBitmapCanvas, dataSet, cubicFillPath, trans, minx, size); } mRenderPaint.setColor(dataSet.getColor()); mRenderPaint.setStyle(Paint.Style.STROKE); trans.pathValueToPixel(cubicPath); mBitmapCanvas.drawPath(cubicPath, mRenderPaint); mRenderPaint.setPathEffect(null); }
Example 8
Source File: LineChartRenderer.java From NetKnight with Apache License 2.0 | 2 votes |
@Override public void drawValues(Canvas c) { if (mChart.getLineData().getYValCount() < mChart.getMaxVisibleCount() * mViewPortHandler.getScaleX()) { List<ILineDataSet> dataSets = mChart.getLineData().getDataSets(); for (int i = 0; i < dataSets.size(); i++) { ILineDataSet dataSet = dataSets.get(i); if (!dataSet.isDrawValuesEnabled() || dataSet.getEntryCount() == 0) continue; // apply the text-styling defined by the DataSet applyValueTextStyle(dataSet); Transformer trans = mChart.getTransformer(dataSet.getAxisDependency()); // make sure the values do not interfear with the circles int valOffset = (int) (dataSet.getCircleRadius() * 1.75f); if (!dataSet.isDrawCirclesEnabled()) valOffset = valOffset / 2; int entryCount = dataSet.getEntryCount(); Entry entryFrom = dataSet.getEntryForXIndex((mMinX < 0) ? 0 : mMinX, DataSet.Rounding.DOWN); Entry entryTo = dataSet.getEntryForXIndex(mMaxX, DataSet.Rounding.UP); int diff = (entryFrom == entryTo) ? 1 : 0; if (dataSet.getMode() == LineDataSet.Mode.CUBIC_BEZIER) diff += 1; int minx = Math.max(dataSet.getEntryIndex(entryFrom) - diff, 0); int maxx = Math.min(Math.max(minx + 2, dataSet.getEntryIndex(entryTo) + 1), entryCount); float[] positions = trans.generateTransformedValuesLine( dataSet, mAnimator.getPhaseX(), mAnimator.getPhaseY(), minx, maxx); for (int j = 0; j < positions.length; j += 2) { float x = positions[j]; float y = positions[j + 1]; if (!mViewPortHandler.isInBoundsRight(x)) break; if (!mViewPortHandler.isInBoundsLeft(x) || !mViewPortHandler.isInBoundsY(y)) continue; Entry entry = dataSet.getEntryForIndex(j / 2 + minx); drawValue(c, dataSet.getValueFormatter(), entry.getVal(), entry, i, x, y - valOffset, dataSet.getValueTextColor(j / 2)); } } } }