Laggy chart
I've made custom chart view `public class TargetZoneCombinedChart extends CombinedChart {
protected Paint mYAxisSafeZonePaint;
private List<TargetZone> mTargetZones;
public TargetZoneCombinedChart(Context context) {
super(context);
}
public TargetZoneCombinedChart(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TargetZoneCombinedChart(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void init() {
super.init();
mYAxisSafeZonePaint = new Paint();
mYAxisSafeZonePaint.setStyle(Paint.Style.FILL);
mTargetZones = new ArrayList<>();
}
@Override
protected void onDraw(Canvas canvas) {
for (TargetZone targetZone : mTargetZones) {
// prepare coordinates
float[] pts = new float[4];
pts[1] = targetZone.lowerLimit;
pts[3] = targetZone.upperLimit;
mLeftAxisTransformer.pointValuesToPixel(pts);
// draw
mYAxisSafeZonePaint.setColor(targetZone.color);
canvas.drawRect(mViewPortHandler.contentLeft(), pts[1], mViewPortHandler.contentRight(),
pts[3], mYAxisSafeZonePaint);
}
super.onDraw(canvas);
}
public void addTargetZone(TargetZone targetZone){
mTargetZones.add(targetZone);
}
public List<TargetZone> getTargetZones(){
return mTargetZones;
}
public void clearTargetZones(){
mTargetZones = new ArrayList<>();
}
public static class TargetZone {
public final int color;
public final float lowerLimit;
public final float upperLimit;
public Target Zone(int color, float lowerLimit, float upperLimit) {
this.color = color;
this.lowerLimit = lowerLimit;
this.upperLimit = upperLimit;
}
}
}`
However the chart is lagging whenever i swipe on it horizontally. xAxis maximum right now is 86000.
Setting up the chart code `binding.clRecycler.lineChart.description.isEnabled = false binding.clRecycler.lineChart.setTouchEnabled(true) binding.clRecycler.lineChart.dragDecelerationFrictionCoef = 0.9f binding.clRecycler.lineChart.setPinchZoom(true) binding.clRecycler.lineChart.isDragEnabled = true binding.clRecycler.lineChart.setScaleEnabled(true) binding.clRecycler.lineChart.setDrawGridBackground(false) binding.clRecycler.lineChart.setBackgroundColor(Color.argb(0, 255, 255, 255)) binding.clRecycler.lineChart.setOnChartValueSelectedListener(this) binding.clRecycler.lineChart.setExtraOffsets(0f, 0f, 0f, 5f) val legend: Legend = binding.clRecycler.lineChart.legend legend.isEnabled = false val xAxis: XAxis = binding.clRecycler.lineChart.xAxis xAxis.position = XAxis.XAxisPosition.BOTTOM xAxis.textSize = 12f xAxis.textColor = Color.BLACK xAxis.setDrawAxisLine(false) xAxis.setDrawGridLines(false) xAxis.setCenterAxisLabels(false) xAxis.granularity = 25f //convertDateToXAxisValue(TimeUnit.MINUTES.toMillis(5L)) // same unit as x axis values xAxis.setDrawLimitLinesBehindData(true) xAxis.labelCount = 3 xAxis.valueFormatter = object : ValueFormatter() { @SuppressLint("SimpleDateFormat") override fun getFormattedValue(value: Float): String { val date: Long = convertXAxisValueToDate(value) return SimpleDateFormat("hh").format(Date(date)) + ":00" + SimpleDateFormat(" a").format( Date(date) ) } } val leftAxis: YAxis = binding.clRecycler.lineChart.axisLeft leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART) leftAxis.textSize = 12f leftAxis.setDrawGridLines(true) leftAxis.isGranularityEnabled = true leftAxis.granularity = 5f leftAxis.textColor = Color.BLACK leftAxis.setLabelCount(5, true) leftAxis.setDrawAxisLine(false) var min = readingDataLimitedList[0].reading.toFloat() var max = readingDataLimitedList[0].reading.toFloat()
for (i in 1 until readingDataLimitedList.size) {
if (readingDataLimitedList[i].reading.toFloat() < min) {
min = readingDataLimitedList[i].reading.toFloat()
}
}
for (i in 1 until readingDataLimitedList.size) {
if (readingDataLimitedList[i].reading.toFloat() > max) {
max = readingDataLimitedList[i].reading.toFloat()
}
}
minVal = if (min - 20f < 0 || min >= 20f) {
0f
} else {
(min - 20f)
}
maxVal = if (max + 20 < 200f) {
200f
} else {
(max + 20).toFloat()
}
leftAxis.axisMinimum = minVal
leftAxis.axisMaximum = maxVal
val rightAxis: YAxis = binding.clRecycler.lineChart.axisRight
rightAxis.isEnabled = false
updateTargetArea()
try {
binding.clRecycler.lineChart.setHardwareAccelerationEnabled(true)
} catch (e: Exception) {
Log.d("Error", "Hardware acceleration for data plot failed: $e")
}`
How do i make the chart lag free, is there something wrong in my code or am i missing anything?