MPAndroidChart icon indicating copy to clipboard operation
MPAndroidChart copied to clipboard

need to fix the laggy chart

Open shajin92 opened this issue 2 years ago • 1 comments

i am facing an issue in the line chart . i am receiving an shortarray and i need to plot them in the chart. I am shortarray which consist of 122 elements and i am receiving 60 shortarray i a second . i was able to plot them in my chart. due to heavy work in my ui thread . the chart lag

private fun graph(byteArray: ShortArray?) { val values = ArrayList<Entry>() var set1: LineDataSet? = null for (i in 0 until byteArray?.size!!) {

            byteArray.get(i)?.let { Entry(num.toFloat(), it.toFloat() ) }?.let { values.add(it) }
            num++
        
    }
    if (lineChart.data != null && lineChart.data.dataSetCount > 0) {

        set1 = lineChart.data.getDataSetByIndex(0) as LineDataSet

        while (set1.values.size >= 20000){
            set1.values.removeAt(0)
        }
        set1.values.plusAssign(values)
        set1.notifyDataSetChanged()
        lineChart.data.notifyDataChanged()
        lineChart.notifyDataSetChanged()
        lineChart.invalidate()

    }
    else {
        set1 = LineDataSet(values, "Audio Data")
        set1.setDrawIcons(false)
        set1.color = Color.rgb(255,115,115)

// set1.enableDashedLine(10f, 5f, 0f) set1.setDrawCircles(false) set1.color = Color.BLACK // set1.setCircleColor(Color.BLACK)

        set1.lineWidth = 1f

// set1.circleRadius = 3f

        set1.setDrawCircleHole(false)

        set1.formLineWidth = 1f

// set1.formLineDashEffect = DashPathEffect(floatArrayOf(10f, 5f), 0f) set1.formSize = 15f

        set1.valueTextSize = 9f

// set1.enableDashedHighlightLine(100f, 100f, 0f)

// set1.setDrawFilled(true) set1.fillFormatter = IFillFormatter { dataSet, dataProvider -> lineChart.getAxisLeft().getAxisMinimum() }

        val dataSets: ArrayList<ILineDataSet> = ArrayList()
        dataSets.add(set1)

        val data = LineData(dataSets)
        data.notifyDataChanged()
        lineChart.data = data
        lineChart.notifyDataSetChanged()
        lineChart.invalidate()
    }
}

shajin92 avatar May 26 '23 09:05 shajin92

private fun graph(byteArray: ShortArray?) {
    val values = ArrayList()
    var set1: LineDataSet? = null
    for (i in 0 until byteArray?.size!!) {
        byteArray.get(i)?.let { Entry(num.toFloat(), it.toFloat()) }?.let { values.add(it) }
        num++
    }
    if (lineChart.data != null && lineChart.data.dataSetCount > 0) {
        set1 = lineChart.data.getDataSetByIndex(0) as LineDataSet
        while (set1.values.size >= 20000) {
            set1.values.removeAt(0)
        }
        set1.values.plusAssign(values)
        set1.notifyDataSetChanged()
        lineChart.data.notifyDataChanged()
        lineChart.notifyDataSetChanged()
        lineChart.invalidate()
    } else {
        set1 = LineDataSet(values, "Audio Data")
        set1.setDrawIcons(false)
        set1.color = Color.rgb(255, 115, 115)
        // set1.enableDashedLine(10f, 5f, 0f)
        set1.setDrawCircles(false)
        set1.color = Color.BLACK
        // set1.setCircleColor(Color.BLACK)
        set1.lineWidth = 1f
        // set1.circleRadius = 3f
        set1.setDrawCircleHole(false)
        set1.formLineWidth = 1f
        // set1.formLineDashEffect = DashPathEffect(floatArrayOf(10f, 5f), 0f)
        set1.formSize = 15f
        set1.valueTextSize = 9f
        // set1.enableDashedHighlightLine(100f, 100f, 0f)
        // set1.setDrawFilled(true)
        set1.fillFormatter =
            IFillFormatter { dataSet, dataProvider -> lineChart.getAxisLeft().getAxisMinimum() }
        val dataSets: ArrayList<ILineDataSet> = ArrayList()
        dataSets.add(set1)
        val data = LineData(dataSets)
        data.notifyDataChanged()
        lineChart.data = data
        lineChart.notifyDataSetChanged()
        lineChart.invalidate()
    }
}

it's draw ui or data processing time consuming multi thread maybe for you

mozushixin avatar Aug 25 '23 10:08 mozushixin