MPAndroidChart icon indicating copy to clipboard operation
MPAndroidChart copied to clipboard

Laggy chart

Open Aagam9833 opened this issue 3 years ago • 0 comments

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?

Aagam9833 avatar May 10 '22 10:05 Aagam9833