Java Code Examples for com.github.mikephil.charting.interfaces.datasets.ILineDataSet#getEntryCount()
The following examples show how to use
com.github.mikephil.charting.interfaces.datasets.ILineDataSet#getEntryCount() .
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 | 6 votes |
protected void drawDataSet(Canvas c, ILineDataSet dataSet) { if (dataSet.getEntryCount() < 1) return; mRenderPaint.setStrokeWidth(dataSet.getLineWidth()); mRenderPaint.setPathEffect(dataSet.getDashPathEffect()); // if drawing cubic lines is enabled if (dataSet.isDrawCubicEnabled()) { drawCubic(c, dataSet); // draw normal (straight) lines } else { drawLinear(c, dataSet); } mRenderPaint.setPathEffect(null); }
Example 2
Source File: LineChartRenderer.java From Ticket-Analysis with MIT License | 6 votes |
protected void drawDataSet(Canvas c, ILineDataSet dataSet) { if (dataSet.getEntryCount() < 1) return; mRenderPaint.setStrokeWidth(dataSet.getLineWidth()); mRenderPaint.setPathEffect(dataSet.getDashPathEffect()); switch (dataSet.getMode()) { default: case LINEAR: case STEPPED: drawLinear(c, dataSet); break; case CUBIC_BEZIER: drawCubicBezier(dataSet); break; case HORIZONTAL_BEZIER: drawHorizontalBezier(dataSet); break; } mRenderPaint.setPathEffect(null); }
Example 3
Source File: LineChartRenderer.java From android-kline with Apache License 2.0 | 6 votes |
protected void drawDataSet(Canvas c, ILineDataSet dataSet) { if (dataSet.getEntryCount() < 1) return; mRenderPaint.setStrokeWidth(dataSet.getLineWidth()); mRenderPaint.setPathEffect(dataSet.getDashPathEffect()); switch (dataSet.getMode()) { default: case LINEAR: case STEPPED: drawLinear(c, dataSet); break; case CUBIC_BEZIER: drawCubicBezier(dataSet); break; case HORIZONTAL_BEZIER: drawHorizontalBezier(dataSet); break; } mRenderPaint.setPathEffect(null); }
Example 4
Source File: LineChartRenderer.java From android-kline with Apache License 2.0 | 6 votes |
protected void drawDataSet(Canvas c, ILineDataSet dataSet) { if (dataSet.getEntryCount() < 1) return; mRenderPaint.setStrokeWidth(dataSet.getLineWidth()); mRenderPaint.setPathEffect(dataSet.getDashPathEffect()); switch (dataSet.getMode()) { default: case LINEAR: case STEPPED: drawLinear(c, dataSet); break; case CUBIC_BEZIER: drawCubicBezier(dataSet); break; case HORIZONTAL_BEZIER: drawHorizontalBezier(dataSet); break; } mRenderPaint.setPathEffect(null); }
Example 5
Source File: LineChartRenderer.java From NetKnight with Apache License 2.0 | 6 votes |
protected void drawDataSet(Canvas c, ILineDataSet dataSet) { if (dataSet.getEntryCount() < 1) return; mRenderPaint.setStrokeWidth(dataSet.getLineWidth()); mRenderPaint.setPathEffect(dataSet.getDashPathEffect()); switch (dataSet.getMode()) { default: case LINEAR: case STEPPED: drawLinear(c, dataSet); break; case CUBIC_BEZIER: drawCubicBezier(c, dataSet); break; case HORIZONTAL_BEZIER: drawHorizontalBezier(c, dataSet); break; } mRenderPaint.setPathEffect(null); }
Example 6
Source File: LineChartRenderer.java From Stayfit with Apache License 2.0 | 5 votes |
@Override public void drawData(Canvas c) { int width = (int) mViewPortHandler.getChartWidth(); int height = (int) mViewPortHandler.getChartHeight(); if (mDrawBitmap == null || (mDrawBitmap.get().getWidth() != width) || (mDrawBitmap.get().getHeight() != height)) { if (width > 0 && height > 0) { mDrawBitmap = new WeakReference<Bitmap>(Bitmap.createBitmap(width, height, mBitmapConfig)); mBitmapCanvas = new Canvas(mDrawBitmap.get()); } else return; } mDrawBitmap.get().eraseColor(Color.TRANSPARENT); LineData lineData = mChart.getLineData(); for (ILineDataSet set : lineData.getDataSets()) { if (set.isVisible() && set.getEntryCount() > 0) drawDataSet(c, set); } c.drawBitmap(mDrawBitmap.get(), 0, 0, mRenderPaint); }
Example 7
Source File: LineChartRenderer.java From NetKnight with Apache License 2.0 | 5 votes |
@Override public void drawData(Canvas c) { int width = (int) mViewPortHandler.getChartWidth(); int height = (int) mViewPortHandler.getChartHeight(); if (mDrawBitmap == null || (mDrawBitmap.get().getWidth() != width) || (mDrawBitmap.get().getHeight() != height)) { if (width > 0 && height > 0) { mDrawBitmap = new WeakReference<Bitmap>(Bitmap.createBitmap(width, height, mBitmapConfig)); mBitmapCanvas = new Canvas(mDrawBitmap.get()); } else return; } mDrawBitmap.get().eraseColor(Color.TRANSPARENT); LineData lineData = mChart.getLineData(); for (ILineDataSet set : lineData.getDataSets()) { if (set.isVisible() && set.getEntryCount() > 0) drawDataSet(c, set); } c.drawBitmap(mDrawBitmap.get(), 0, 0, mRenderPaint); }
Example 8
Source File: TickChart.java From android-kline with Apache License 2.0 | 5 votes |
public void refreshData(float price) { if (price <= 0 || price == mLastPrice) { return; } mLastPrice = price; LineData data = mChart.getData(); if (data != null) { ILineDataSet setSell = data.getDataSetByIndex(DATA_SET_PRICE); if (setSell == null) { setSell = createSet(TYPE_FULL); data.addDataSet(setSell); } data.removeEntry(setSell.getEntryCount(), DATA_SET_PRICE); Entry entry = new Entry(setSell.getEntryCount(), price); data.addEntry(entry, DATA_SET_PRICE); ILineDataSet paddingSet = data.getDataSetByIndex(DATA_SET_PADDING); if (paddingSet == null) { paddingSet = createSet(TYPE_DASHED); data.addDataSet(paddingSet); } int count = paddingSet.getEntryCount(); paddingSet.clear(); for (int i = 0; i < count; i++) { paddingSet.addEntry(new Entry(setSell.getEntryCount() + i, price)); } Highlight chartHighlighter = new Highlight(setSell.getEntryCount() + paddingSet.getEntryCount(), price, DATA_SET_PADDING); mChart.highlightValue(chartHighlighter); data.notifyDataChanged(); mChart.notifyDataSetChanged(); mChart.invalidate(); } }
Example 9
Source File: LineChartRenderer.java From StockChart-MPAndroidChart with MIT License | 4 votes |
protected void drawCubicBezier(ILineDataSet dataSet) { float phaseY = mAnimator.getPhaseY(); Transformer trans = mChart.getTransformer(dataSet.getAxisDependency()); mXBounds.set(mChart, dataSet); float intensity = dataSet.getCubicIntensity(); cubicPath.reset(); if (mXBounds.range >= 1) { float prevDx = 0f; float prevDy = 0f; float curDx = 0f; float curDy = 0f; // Take an extra point from the left, and an extra from the right. // That's because we need 4 points for a cubic bezier (cubic=4), otherwise we get lines moving and doing weird stuff on the edges of the chart. // So in the starting `prev` and `cur`, go -2, -1 // And in the `lastIndex`, add +1 final int firstIndex = mXBounds.min + 1; final int lastIndex = mXBounds.min + mXBounds.range; Entry prevPrev; Entry prev = dataSet.getEntryForIndex(Math.max(firstIndex - 2, 0)); Entry cur = dataSet.getEntryForIndex(Math.max(firstIndex - 1, 0)); Entry next = cur; int nextIndex = -1; if (cur == null) { return; } // let the spline start cubicPath.moveTo(cur.getX(), cur.getY() * phaseY); for (int j = mXBounds.min + 1; j <= mXBounds.range + mXBounds.min; j++) { prevPrev = prev; prev = cur; cur = nextIndex == j ? next : dataSet.getEntryForIndex(j); nextIndex = j + 1 < dataSet.getEntryCount() ? j + 1 : j; next = dataSet.getEntryForIndex(nextIndex); prevDx = (cur.getX() - prevPrev.getX()) * intensity; prevDy = (cur.getY() - prevPrev.getY()) * intensity; curDx = (next.getX() - prev.getX()) * intensity; curDy = (next.getY() - prev.getY()) * intensity; cubicPath.cubicTo(prev.getX() + prevDx, (prev.getY() + prevDy) * phaseY, cur.getX() - curDx, (cur.getY() - curDy) * phaseY, cur.getX(), cur.getY() * phaseY); } } // if filled is enabled, close the path if (dataSet.isDrawFilledEnabled()) { cubicFillPath.reset(); cubicFillPath.addPath(cubicPath); drawCubicFill(mBitmapCanvas, dataSet, cubicFillPath, trans, mXBounds); } mRenderPaint.setColor(dataSet.getColor()); mRenderPaint.setStyle(Paint.Style.STROKE); trans.pathValueToPixel(cubicPath); mBitmapCanvas.drawPath(cubicPath, mRenderPaint); mRenderPaint.setPathEffect(null); }
Example 10
Source File: TickChart.java From android-kline with Apache License 2.0 | 4 votes |
public void addEntry(HisData hisData) { hisData = DataUtils.calculateHisData(hisData, mList); LineData data = mChart.getData(); if (data != null) { ILineDataSet setSell = data.getDataSetByIndex(DATA_SET_PRICE); if (setSell == null) { setSell = createSet(TYPE_FULL); data.addDataSet(setSell); } ILineDataSet aveSet = data.getDataSetByIndex(DATA_SET_AVE); if (aveSet == null) { aveSet = createSet(DATA_SET_AVE); data.addDataSet(aveSet); } int index = mList.indexOf(hisData); if (index >= 0) { mList.remove(hisData); data.removeEntry(index, DATA_SET_PRICE); data.removeEntry(index, DATA_SET_AVE); } mList.add(hisData); float price = (float) hisData.getClose(); data.addEntry(new Entry(setSell.getEntryCount(), price), DATA_SET_PRICE); data.addEntry(new Entry(setSell.getEntryCount(), (float) hisData.getAvePrice()), DATA_SET_AVE); ILineDataSet paddingSet = data.getDataSetByIndex(DATA_SET_PADDING); if (paddingSet == null) { paddingSet = createSet(TYPE_DASHED); data.addDataSet(paddingSet); } int count = paddingSet.getEntryCount(); if (count > PADDING_COUNT && index < 0) { count--; } paddingSet.clear(); for (int i = 0; i < count; i++) { paddingSet.addEntry(new Entry(setSell.getEntryCount() + i, price)); } Highlight chartHighlighter = new Highlight(setSell.getEntryCount() + paddingSet.getEntryCount(), price, DATA_SET_PADDING); mChart.highlightValue(chartHighlighter); data.notifyDataChanged(); mChart.notifyDataSetChanged(); mChart.invalidate(); } }
Example 11
Source File: AppLineChartRenderer.java From android-kline with Apache License 2.0 | 4 votes |
protected void drawLastPointCircle(Canvas c) { mRenderPaint.setStyle(Paint.Style.FILL); float phaseY = mAnimator.getPhaseY(); mCirclesBuffer[0] = 0; mCirclesBuffer[1] = 0; 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; mRenderPaint.setColor(dataSet.getCircleColor(0)); mCirclePaintInner.setColor(dataSet.getCircleHoleColor()); Transformer trans = mChart.getTransformer(dataSet.getAxisDependency()); mXBounds.set(mChart, dataSet); float circleRadius = dataSet.getCircleRadius() * 2.0f; float circleHoleRadius = dataSet.getCircleHoleRadius() * 2.0f; boolean drawCircleHole = dataSet.isDrawCircleHoleEnabled() && circleHoleRadius < circleRadius && circleHoleRadius > 0.f; Entry e = dataSet.getEntryForIndex(dataSet.getEntryCount() - 1); if (e == null) return; mCirclesBuffer[0] = e.getX(); mCirclesBuffer[1] = e.getY() * phaseY; trans.pointValuesToPixel(mCirclesBuffer); if (!mViewPortHandler.isInBoundsRight(mCirclesBuffer[0])) return; if (!mViewPortHandler.isInBoundsLeft(mCirclesBuffer[0]) || !mViewPortHandler.isInBoundsY(mCirclesBuffer[1])) return; c.drawCircle( mCirclesBuffer[0], mCirclesBuffer[1], circleRadius, mRenderPaint); if (drawCircleHole) { c.drawCircle( mCirclesBuffer[0], mCirclesBuffer[1], circleHoleRadius, mCirclePaintInner); } } }
Example 12
Source File: AppLineChart.java From android-kline with Apache License 2.0 | 4 votes |
@Override protected void drawMarkers(Canvas canvas) { if (mMarker == null || !isDrawMarkersEnabled() || !valuesToHighlight()) return; for (int i = 0; i < mIndicesToHighlight.length; i++) { Highlight highlight = mIndicesToHighlight[i]; ILineDataSet set = mData.getDataSetByIndex(highlight.getDataSetIndex()); Entry e = mData.getEntryForHighlight(mIndicesToHighlight[i]); int entryIndex = set.getEntryIndex(e); // make sure entry not null if (e == null || entryIndex > set.getEntryCount() * mAnimator.getPhaseX()) continue; float[] pos = getMarkerPosition(highlight); // check bounds if (!mViewPortHandler.isInBounds(pos[0], pos[1])) continue; // callbacks to update the content mMarker.refreshContent(e, highlight); if (mXMarker != null && set.isVerticalHighlightIndicatorEnabled()) { mXMarker.refreshContent(e, highlight); } // draw the marker // if (mMarker instanceof LineChartYMarkerView) { LineChartYMarkerView yMarker = (LineChartYMarkerView) mMarker; LineChartXMarkerView xMarker = (LineChartXMarkerView) mXMarker; int width = yMarker.getMeasuredWidth(); mMarker.draw(canvas, getMeasuredWidth() - width * 1.05f, pos[1] - yMarker.getMeasuredHeight() / 2); if (mXMarker != null && set.isVerticalHighlightIndicatorEnabled()) { mXMarker.draw(canvas, pos[0] - (xMarker.getMeasuredWidth() / 2), getMeasuredHeight()); } // } else { // mMarker.draw(canvas, pos[0], pos[1]); // } } }
Example 13
Source File: LineChartRenderer.java From android-kline with Apache License 2.0 | 4 votes |
public void drawCircle(Canvas c, Highlight high, float x) { mRenderPaint.setStyle(Paint.Style.FILL); float phaseY = mAnimator.getPhaseY(); mCirclesBuffer[0] = 0; mCirclesBuffer[1] = 0; 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; mRenderPaint.setColor(dataSet.getCircleColor(0)); mCirclePaintInner.setColor(dataSet.getCircleHoleColor()); Transformer trans = mChart.getTransformer(dataSet.getAxisDependency()); mXBounds.set(mChart, dataSet); float circleRadius = dataSet.getCircleRadius() * 2.0f; float circleHoleRadius = dataSet.getCircleHoleRadius() * 2.0f; boolean drawCircleHole = dataSet.isDrawCircleHoleEnabled() && circleHoleRadius < circleRadius && circleHoleRadius > 0.f; if (high.getX() < dataSet.getEntryCount() - 1) { Entry e = dataSet.getEntryForIndex((int) high.getX()); if (e == null) return; mCirclesBuffer[1] = e.getY() * phaseY; trans.pointValuesToPixel(mCirclesBuffer); mCirclesBuffer[0] = x; if (!mViewPortHandler.isInBoundsRight(mCirclesBuffer[0])) return; if (!mViewPortHandler.isInBoundsLeft(mCirclesBuffer[0]) || !mViewPortHandler.isInBoundsY(mCirclesBuffer[1])) return; c.drawCircle( mCirclesBuffer[0], mCirclesBuffer[1], circleRadius, mRenderPaint); if (drawCircleHole) { c.drawCircle( mCirclesBuffer[0], mCirclesBuffer[1], circleHoleRadius, mCirclePaintInner); } } } }
Example 14
Source File: LineChartRenderer.java From android-kline with Apache License 2.0 | 4 votes |
protected void drawCircles(Canvas c) { mRenderPaint.setStyle(Paint.Style.FILL); float phaseY = mAnimator.getPhaseY(); mCirclesBuffer[0] = 0; mCirclesBuffer[1] = 0; 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()); mXBounds.set(mChart, dataSet); 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; DataSetImageCache imageCache; if (mImageCaches.containsKey(dataSet)) { imageCache = mImageCaches.get(dataSet); } else { imageCache = new DataSetImageCache(); mImageCaches.put(dataSet, imageCache); } boolean changeRequired = imageCache.init(dataSet); // only fill the cache with new bitmaps if a change is required if (changeRequired) { imageCache.fill(dataSet, drawCircleHole, drawTransparentCircleHole); } int boundsRangeCount = mXBounds.range + mXBounds.min; for (int j = mXBounds.min; j <= boundsRangeCount; j++) { Entry e = dataSet.getEntryForIndex(j); if (e == null) break; mCirclesBuffer[0] = e.getX(); mCirclesBuffer[1] = e.getY() * phaseY; trans.pointValuesToPixel(mCirclesBuffer); if (!mViewPortHandler.isInBoundsRight(mCirclesBuffer[0])) break; if (!mViewPortHandler.isInBoundsLeft(mCirclesBuffer[0]) || !mViewPortHandler.isInBoundsY(mCirclesBuffer[1])) continue; Bitmap circleBitmap = imageCache.getBitmap(j); if (circleBitmap != null) { c.drawBitmap(circleBitmap, mCirclesBuffer[0] - circleRadius, mCirclesBuffer[1] - circleRadius, null); } } } }
Example 15
Source File: LineChartRenderer.java From android-kline with Apache License 2.0 | 4 votes |
protected void drawCubicBezier(ILineDataSet dataSet) { float phaseX = Math.max(0.f, Math.min(1.f, mAnimator.getPhaseX())); float phaseY = mAnimator.getPhaseY(); Transformer trans = mChart.getTransformer(dataSet.getAxisDependency()); mXBounds.set(mChart, dataSet); float intensity = dataSet.getCubicIntensity(); cubicPath.reset(); if (mXBounds.range >= 1) { float prevDx = 0f; float prevDy = 0f; float curDx = 0f; float curDy = 0f; // Take an extra point from the left, and an extra from the right. // That's because we need 4 points for a cubic bezier (cubic=4), otherwise we get lines moving and doing weird stuff on the edges of the chart. // So in the starting `prev` and `cur`, go -2, -1 // And in the `lastIndex`, add +1 final int firstIndex = mXBounds.min + 1; final int lastIndex = mXBounds.min + mXBounds.range; Entry prevPrev; Entry prev = dataSet.getEntryForIndex(Math.max(firstIndex - 2, 0)); Entry cur = dataSet.getEntryForIndex(Math.max(firstIndex - 1, 0)); Entry next = cur; int nextIndex = -1; if (cur == null) return; // let the spline start cubicPath.moveTo(cur.getX(), cur.getY() * phaseY); for (int j = mXBounds.min + 1; j <= mXBounds.range + mXBounds.min; j++) { prevPrev = prev; prev = cur; cur = nextIndex == j ? next : dataSet.getEntryForIndex(j); nextIndex = j + 1 < dataSet.getEntryCount() ? j + 1 : j; next = dataSet.getEntryForIndex(nextIndex); prevDx = (cur.getX() - prevPrev.getX()) * intensity; prevDy = (cur.getY() - prevPrev.getY()) * intensity; curDx = (next.getX() - prev.getX()) * intensity; curDy = (next.getY() - prev.getY()) * intensity; cubicPath.cubicTo(prev.getX() + prevDx, (prev.getY() + prevDy) * phaseY, cur.getX() - curDx, (cur.getY() - curDy) * phaseY, cur.getX(), cur.getY() * phaseY); } } // if filled is enabled, close the path if (dataSet.isDrawFilledEnabled()) { cubicFillPath.reset(); cubicFillPath.addPath(cubicPath); drawCubicFill(mBitmapCanvas, dataSet, cubicFillPath, trans, mXBounds); } mRenderPaint.setColor(dataSet.getColor()); mRenderPaint.setStyle(Paint.Style.STROKE); trans.pathValueToPixel(cubicPath); mBitmapCanvas.drawPath(cubicPath, mRenderPaint); mRenderPaint.setPathEffect(null); }
Example 16
Source File: LineChartRenderer.java From Ticket-Analysis with MIT License | 4 votes |
protected void drawCircles(Canvas c) { mRenderPaint.setStyle(Paint.Style.FILL); float phaseY = mAnimator.getPhaseY(); mCirclesBuffer[0] = 0; mCirclesBuffer[1] = 0; 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()); mXBounds.set(mChart, dataSet); 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; DataSetImageCache imageCache; if (mImageCaches.containsKey(dataSet)) { imageCache = mImageCaches.get(dataSet); } else { imageCache = new DataSetImageCache(); mImageCaches.put(dataSet, imageCache); } boolean changeRequired = imageCache.init(dataSet); // only fill the cache with new bitmaps if a change is required if (changeRequired) { imageCache.fill(dataSet, drawCircleHole, drawTransparentCircleHole); } int boundsRangeCount = mXBounds.range + mXBounds.min; for (int j = mXBounds.min; j <= boundsRangeCount; j++) { Entry e = dataSet.getEntryForIndex(j); if (e == null) break; mCirclesBuffer[0] = e.getX(); mCirclesBuffer[1] = e.getY() * phaseY; trans.pointValuesToPixel(mCirclesBuffer); if (!mViewPortHandler.isInBoundsRight(mCirclesBuffer[0])) break; if (!mViewPortHandler.isInBoundsLeft(mCirclesBuffer[0]) || !mViewPortHandler.isInBoundsY(mCirclesBuffer[1])) continue; Bitmap circleBitmap = imageCache.getBitmap(j); if (circleBitmap != null) { c.drawBitmap(circleBitmap, mCirclesBuffer[0] - circleRadius, mCirclesBuffer[1] - circleRadius, null); } } } }
Example 17
Source File: LineChartRenderer.java From Ticket-Analysis with MIT License | 4 votes |
protected void drawCubicBezier(ILineDataSet dataSet) { float phaseX = Math.max(0.f, Math.min(1.f, mAnimator.getPhaseX())); float phaseY = mAnimator.getPhaseY(); Transformer trans = mChart.getTransformer(dataSet.getAxisDependency()); mXBounds.set(mChart, dataSet); float intensity = dataSet.getCubicIntensity(); cubicPath.reset(); if (mXBounds.range >= 1) { float prevDx = 0f; float prevDy = 0f; float curDx = 0f; float curDy = 0f; // Take an extra point from the left, and an extra from the right. // That's because we need 4 points for a cubic bezier (cubic=4), otherwise we get lines moving and doing weird stuff on the edges of the chart. // So in the starting `prev` and `cur`, go -2, -1 // And in the `lastIndex`, add +1 final int firstIndex = mXBounds.min + 1; final int lastIndex = mXBounds.min + mXBounds.range; Entry prevPrev; Entry prev = dataSet.getEntryForIndex(Math.max(firstIndex - 2, 0)); Entry cur = dataSet.getEntryForIndex(Math.max(firstIndex - 1, 0)); Entry next = cur; int nextIndex = -1; if (cur == null) return; // let the spline start cubicPath.moveTo(cur.getX(), cur.getY() * phaseY); for (int j = mXBounds.min + 1; j <= mXBounds.range + mXBounds.min; j++) { prevPrev = prev; prev = cur; cur = nextIndex == j ? next : dataSet.getEntryForIndex(j); nextIndex = j + 1 < dataSet.getEntryCount() ? j + 1 : j; next = dataSet.getEntryForIndex(nextIndex); prevDx = (cur.getX() - prevPrev.getX()) * intensity; prevDy = (cur.getY() - prevPrev.getY()) * intensity; curDx = (next.getX() - prev.getX()) * intensity; curDy = (next.getY() - prev.getY()) * intensity; cubicPath.cubicTo(prev.getX() + prevDx, (prev.getY() + prevDy) * phaseY, cur.getX() - curDx, (cur.getY() - curDy) * phaseY, cur.getX(), cur.getY() * phaseY); } } // if filled is enabled, close the path if (dataSet.isDrawFilledEnabled()) { cubicFillPath.reset(); cubicFillPath.addPath(cubicPath); drawCubicFill(mBitmapCanvas, dataSet, cubicFillPath, trans, mXBounds); } mRenderPaint.setColor(dataSet.getColor()); mRenderPaint.setStyle(Paint.Style.STROKE); trans.pathValueToPixel(cubicPath); mBitmapCanvas.drawPath(cubicPath, mRenderPaint); mRenderPaint.setPathEffect(null); }
Example 18
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 19
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)); } } } }
Example 20
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); } } }