package com.numetriclabz.numandroidcharts; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import java.util.List; public class Renderer { private static final float curve_intensity = 0.16f; protected void DrawCubicPath(Canvas canvas, List<ChartData> dataList, Paint paint, float height, boolean area_spline) { final int lineSize = dataList.size(); float prePriviousX = Float.NaN; float prePreviousY = Float.NaN; float previousX = Float.NaN; float previousY = Float.NaN; float curr_x = Float.NaN; float curr_y = Float.NaN; float next_x= Float.NaN; float next_y = Float.NaN; Path path = new Path(); if(area_spline){ paint.setStyle(Paint.Style.FILL_AND_STROKE); paint.setAlpha(100); path.moveTo(dataList.get(0).getX_values(), height); path.lineTo(dataList.get(0).getX_values(), dataList.get(0).getY_values()); } for (int valueIndex = 0; valueIndex < lineSize; ++valueIndex) { if (Float.isNaN(curr_x)) { curr_x = dataList.get(valueIndex).getX_values(); curr_y = dataList.get(valueIndex).getY_values(); } if (Float.isNaN(previousX)) { if (valueIndex > 0) { previousX = dataList.get(valueIndex - 1).getX_values(); previousY = dataList.get(valueIndex - 1).getY_values(); } else { previousX = curr_x; previousY = curr_y; } } if (Float.isNaN(prePriviousX)) { if (valueIndex > 1) { prePriviousX = dataList.get(valueIndex - 2).getX_values(); prePreviousY = dataList.get(valueIndex - 2).getY_values(); } else { prePriviousX = previousX; prePreviousY = previousY; } } // nextPoint is always new one or it is equal currentPoint. if (valueIndex < lineSize - 1) { next_x = dataList.get(valueIndex + 1).getX_values(); next_y = dataList.get(valueIndex + 1).getY_values(); } else { next_x = curr_x; next_y = curr_y; } if (valueIndex == 0) { if(!area_spline) path.moveTo(curr_x, curr_y); } else { // Calculate control points. final float first_diff_x = (curr_x - prePriviousX); final float fisrt_diff_y = (curr_y - prePreviousY); final float sec_diff_x = (next_x - previousX); final float sec_diff_y = (next_y - previousY); final float first_control_x = previousX + (curve_intensity * first_diff_x); final float first_control_y = previousY + (curve_intensity * fisrt_diff_y); final float secondControlPointX = curr_x - (curve_intensity * sec_diff_x); final float secondControlPointY = curr_y - (curve_intensity * sec_diff_y); path.cubicTo(first_control_x, first_control_y, secondControlPointX, secondControlPointY, curr_x, curr_y); } prePriviousX = previousX; prePreviousY = previousY; previousX = curr_x; previousY = curr_y; curr_x = next_x; curr_y = next_y; } if(area_spline){ path.lineTo(dataList.get(dataList.size()-1).getX_values(), height); } canvas.drawPath(path, paint); path.reset(); } protected void DrawCircle(Canvas canvas, List<ChartData> dataset, Paint paint, float radius){ paint.setStyle(Paint.Style.FILL); for(int i=0; i< dataset.size(); i++) { canvas.drawCircle(dataset.get(i).getX_values(), dataset.get(i).getY_values(), radius, paint); } } }