Newer
Older
SmartKitchen / app / src / main / java / com / casic / br / utils / ChartViewHelper.kt
package com.casic.br.utils

import com.casic.br.R
import com.casic.br.extensions.init
import com.casic.br.model.LineChartEntryModel
import com.casic.br.widgets.LineChartMarkerView
import com.github.mikephil.charting.charts.LineChart
import com.github.mikephil.charting.charts.PieChart
import com.github.mikephil.charting.data.*
import com.github.mikephil.charting.formatter.ValueFormatter
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet
import com.pengxh.kt.lite.extensions.convertColor
import java.text.DecimalFormat


/**
 * @author a203
 * @description 各种图初始化配置类
 * @date 2022/2/15 16:24
 * @email 290677893@qq.com
 */
object ChartViewHelper {
    /**
     * 单条折线图
     * */
    fun setSingleLineChartData(
        chart: LineChart, xAxisDate: MutableList<String>, entryModel: LineChartEntryModel
    ) {
        //每次加载数据都初始化折线图
        chart.init(chart.context)
        if (entryModel.entryList.isEmpty()) {
            return
        }
        //绑定数据
        val lineDataSets: MutableList<ILineDataSet> = ArrayList()
        //设置数据
        val dataSet = LineDataSet(entryModel.entryList, entryModel.entryList[0].data.toString())
        dataSet.setDrawCircles(true)
        //线条颜色
        dataSet.color = entryModel.lineColor
        //圆点颜色
        dataSet.setCircleColor(entryModel.lineColor)
        dataSet.setDrawFilled(true)
        dataSet.fillColor = entryModel.lineColor
        dataSet.mode = LineDataSet.Mode.CUBIC_BEZIER
        lineDataSets.add(dataSet)

        val lineData = LineData(lineDataSets)
        lineData.setDrawValues(false)
        //添加自定义Marker
        val markerView = LineChartMarkerView(chart.context)
        markerView.chartView = chart
        markerView.setXAxisDate(xAxisDate)
        chart.marker = markerView
        //设置X轴坐标
        val xAxis = chart.xAxis
        if (xAxisDate.size == 1) {
            xAxis.valueFormatter = object : ValueFormatter() {
                override fun getFormattedValue(value: Float): String {
                    return xAxisDate[0]
                }
            }
        } else {
            xAxis.valueFormatter = object : ValueFormatter() {
                override fun getFormattedValue(value: Float): String {
                    return xAxisDate[value.toInt()]
                }
            }
        }
        chart.data = lineData
        chart.invalidate()
    }

    /**
     * 多条折线图
     * */
    fun setLineChartData(
        chart: LineChart, xAxisDate: MutableList<String>, entryModels: List<LineChartEntryModel>
    ) {
        //每次加载数据都初始化折线图
        chart.init(chart.context)
        if (entryModels[0].entryList.isEmpty()) {
            return
        }
        //绑定数据
        val lineDataSets: MutableList<ILineDataSet> = ArrayList()
        entryModels.forEachIndexed { index, it ->
            //设置数据
            val dataSet = LineDataSet(it.entryList, it.entryList?.get(index)?.data.toString())
            dataSet.setDrawCircles(true)
            //线条颜色
            dataSet.color = it.lineColor
            //圆点颜色
            dataSet.setCircleColor(it.lineColor)
            dataSet.setDrawFilled(true)
            dataSet.fillColor = it.lineColor
            dataSet.mode = LineDataSet.Mode.CUBIC_BEZIER
            lineDataSets.add(dataSet)
        }
        val lineData = LineData(lineDataSets)
        lineData.setDrawValues(false)
        //添加自定义Marker
        val markerView = LineChartMarkerView(chart.context)
        markerView.chartView = chart
        markerView.setXAxisDate(xAxisDate)
        chart.marker = markerView
        //设置X轴坐标
        val xAxis = chart.xAxis
        xAxis.valueFormatter = object : ValueFormatter() {
            override fun getFormattedValue(value: Float): String {
                return xAxisDate[value.toInt()]
            }
        }
        chart.data = lineData
        chart.invalidate()
    }

//    /**
//     * 竖直柱状图
//     * */
//    fun setBarChartData(
//        chart: BarChart,
//        xAxisLabel: MutableList<String>,
//        entries: List<BarEntry>,
//        dateType: String
//    ) {
//        //每次加载数据都初始化饼图
//        chart.init(chart.context, xAxisLabel)
//        val barDataSets: MutableList<IBarDataSet> = ArrayList()
//        //绑定数据
//        val dataSet = BarDataSet(entries, "")
//        dataSet.color = R.color.color_1.convertColor(chart.context)
//        dataSet.valueFormatter = object : ValueFormatter() {
//            override fun getFormattedValue(value: Float): String {
//                return DecimalFormat("##0").format(value.toDouble())
//            }
//        }
//        barDataSets.add(dataSet)
//        val barData = BarData(barDataSets)
//        barData.barWidth = 0.5f
//        //添加自定义Marker
//        val markerView = BarChartMarkerView(chart.context)
//        markerView.chartView = chart
//        markerView.setXAxisLabel(xAxisLabel)
//        markerView.setBarDataType(dateType)
//        chart.marker = markerView
//        chart.data = barData
//        chart.invalidate()
//    }
//
//    /**
//     * 横向柱状图
//     * */
//    fun setBarChartData(
//        chart: HorizontalBarChart,
//        xAxisLabel: MutableList<String>,
//        entries: List<BarEntry>
//    ) {
//        //每次加载数据都初始化饼图
//        chart.init(chart.context, xAxisLabel)
//        val barDataSets: MutableList<IBarDataSet> = ArrayList()
//        //绑定数据
//        val dataSet = BarDataSet(entries, "")
//        dataSet.color = R.color.color_6.convertColor(chart.context)
//        dataSet.valueFormatter = object : ValueFormatter() {
//            override fun getFormattedValue(value: Float): String {
//                return DecimalFormat("##0").format(value.toDouble())
//            }
//        }
//        barDataSets.add(dataSet)
//        val barData = BarData(barDataSets)
//        barData.barWidth = 0.5f
//        //添加自定义Marker
//        val markerView = BarChartMarkerView(chart.context)
//        markerView.chartView = chart
//        markerView.setXAxisLabel(xAxisLabel)
//        markerView.setBarDataType("")
//        chart.marker = markerView
//        chart.data = barData
//        chart.invalidate()
//    }

    /**
     * 饼图
     * */
    fun setPieChartData(chart: PieChart, entries: List<PieEntry?>) {
        //每次加载数据都初始化饼图
        chart.init(chart.context)
        if (entries.isEmpty()) {
            return
        }
        //绑定数据
        val dataSet = PieDataSet(entries, "")
        dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙
        dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离
        //设置饼图块颜色
        val colors: MutableList<Int> = ArrayList()
        for (i in entries.indices) {
            colors.add(LocaleConstant.COLORS[i].convertColor(chart.context))
        }
        dataSet.colors = colors
        //设置标签显示在饼图块外面
        dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE
        dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE
        dataSet.valueLineColor =
            R.color.mainThemeColor.convertColor(chart.context)
        dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度
        dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度
        val data = PieData(dataSet)
        data.setValueFormatter(object : ValueFormatter() {
            override fun getFormattedValue(value: Float): String {
                return DecimalFormat("##0.00").format(value.toDouble()) + chart.context.resources.getString(
                    R.string.volume_unit
                )
            }
        })
        data.setValueTextSize(12f)
        data.setValueTextColor(R.color.mainThemeColor.convertColor(chart.context)) //数据值颜色
        chart.data = data
        chart.highlightValues(null)
        chart.invalidate()
    }
}