安卓图表MpAndroidChart使用

复制代码
repositories {
    maven { url 'https://jitpack.io' }
}

dependencies {
    implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
}

布局引用
<com.github.mikephil.charting.charts.CombinedChart
        android:id="@+id/combinedChart"
        android:layout_width="350dp"
        android:layout_height="270dp"
        android:layout_margin="20dp"
        app:layout_constraintTop_toBottomOf="@+id/toolbar"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        />


private lateinit var lineDataSet: LineDataSet//折线数据集
        
/** 初始化 CombinedChart **/
    private fun setupChart() {
        val chart = binding.combinedChart
        // 折线数据集 参数设置
        lineDataSet = LineDataSet(mutableListOf(Entry(0f, 0f)), "实时曲线").apply {
            color = ColorTemplate.rgb("1E88E5")
            lineWidth = 2f
            setDrawCircles(false)
            setDrawValues(false)
            setDrawFilled(true)  // 曲线下方填充
            mode = LineDataSet.Mode.CUBIC_BEZIER // 平滑曲线 LINEAR
            axisDependency = YAxis.AxisDependency.LEFT
        }
        lineDataSet.setDrawFilled(true)
        lineDataSet.fillColor = Color.parseColor("#82F689") // 填充颜色
        lineDataSet.fillAlpha = 80 // 透明度 0~255



        // 曲面折线
        redDataSet = LineDataSet(mutableListOf(), "GC 谱图").apply {
            setDrawHorizontalHighlightIndicator(false)
            setDrawVerticalHighlightIndicator(false)
            lineWidth = 0f             // 安全
            color = Color.TRANSPARENT  // 即使透明也不影响
            mode = LineDataSet.Mode.LINEAR // 不要贝塞尔

            setCircleColor(Color.RED)  // 圆点颜色为红色
            setDrawCircleHole(false)   // 圆点不留白
            setDrawCircles(true) // 不画圆点
            setDrawFilled(false)  // 曲线下方填充
            fillColor = Color.TRANSPARENT
        }


        val lineData = LineData(redDataSet,lineDataSet)

        // 柱状数据集(初始化为空)
        barDataSet = BarDataSet(mutableListOf(), "目标气体峰").apply {
            color = Color.RED
        }
        val barData = BarData(barDataSet).apply { barWidth = 0.8f }

        // CombinedData
        val combinedData = CombinedData().apply {
            setData(lineData)
            setData(barData)
        }
        chart.data = combinedData

        // 限制最大缩放比例
        chart.viewPortHandler.setMaximumScaleX(Float.MAX_VALUE)  // X轴无限放大
        chart.viewPortHandler.setMinimumScaleX(0f)               // 无限缩小(到很小)
        chart.viewPortHandler.setMaximumScaleY(Float.MAX_VALUE)  // Y轴无限放大
        chart.viewPortHandler.setMinimumScaleY(0f)               // 无限缩小

        // X轴设置
        chart.xAxis.apply {
            position = XAxis.XAxisPosition.BOTTOM
            granularity = 1f
            axisMinimum = 0f
        }

        // Y轴设置
//        chart.axisLeft.apply {
//            axisMinimum = 0f
//            valueFormatter = object : ValueFormatter() {
//                override fun getFormattedValue(value: Float): String = "${value.toInt()} mV"
//            }
//            setAxisMinValue(0f)//强制y轴最小值
//        }
        chart.axisLeft.apply {
            axisMinimum = 0f            // 下限固定 0(PID 不会为负)
            spaceTop = 80f              // 上方预留 20%,防止贴顶
            spaceBottom = 5f            // 下方预留一点更美观
            setDrawGridLines(true)
            setDrawZeroLine(false)

            // Y 轴单位
            valueFormatter = object : ValueFormatter() {
                override fun getFormattedValue(value: Float): String = "${value.toInt()} mV"
            }
        }

        chart.axisRight.isEnabled = false

        // 缩放 + 拖动 + 图表一次最多能看到多少 X 点(宽度限制)
        chart.setScaleEnabled(true)
        chart.setPinchZoom(true)
        chart.setVisibleXRangeMaximum(maxVisiblePoints)

        chart.description.isEnabled = false



        //替换默认的renderer为自定义的SampleHighlightRenderer,画高亮区间
        val highlightPaint = Paint().apply {
            style = Paint.Style.FILL
            color = Color.parseColor("#5533B5E5") // 半透明蓝色
        }
        val renderer = SampleHighlightRenderer(binding.combinedChart, binding.combinedChart.viewPortHandler, highlightPaint)
        binding.combinedChart.renderer = renderer


        //设置高亮的mark
//        val marker = MyMarkerView(this)
//        marker.chartView = binding.combinedChart
//        binding.combinedChart.marker = marker
//
//        chart.isHighlightPerTapEnabled = true
//        chart.isHighlightPerDragEnabled = true
        chart.invalidate()
    }



 private fun addGCPoint(value: Float) {
        val chart = binding.combinedChart
        val entry = Entry(xIndex, value)

        xIndex += 1f

        lineDataSet.addEntry(entry)
        if(xIndex == 10f || xIndex == 20f){
            redDataSet.addEntry(entry)
        }


        chart.data.lineData.notifyDataChanged()
        chart.data.notifyDataChanged()
        chart.notifyDataSetChanged()

        // 固定显示最近 maxVisiblePoints 个点
        if (lineDataSet.entryCount > maxVisiblePoints) {
            chart.setVisibleXRangeMaximum(maxVisiblePoints)
            chart.moveViewToX(lineDataSet.entryCount - maxVisiblePoints)
        } else {
            chart.moveViewToX(0f)
        }

        chart.invalidate()

    }
相关推荐
故渊at6 分钟前
第十四板块:Android 硬件抽象与安全加固 | 第三十三篇:Verified Boot 与 硬件信任链(Trusty TEE)
android·安全·信任链·verified
Tangyuewei19 分钟前
我用 AI 辅助开发了一个发型 App,然后打包成了 APK
android·人工智能·ai编程
程序课代表35 分钟前
Android源码分析挖掘(二) fork大师zygote进程
android·zygote
帅次1 小时前
Android 16(API Level 36)Activity 启动流程源码级解析
android·framework·源码解析·activity启动流程·android 16
chian-ocean1 小时前
Microi吾码:从零到服装ERP:低代码打造企业级系统的实战之旅
android·低代码·rxjava
故渊at3 小时前
第十五板块:Android 系统调试与逆向工程 | 第三十五篇:ART 虚拟机内部机制与 OAT 文件格式
android·虚拟机·art·机器码·oat文件格式
alexhilton9 小时前
Android的Agent优先时代:构建时vs运行时
android·kotlin·android jetpack
Cutecat_10 小时前
视频字幕处理工具横向:提取模式 vs 编辑模式,该如何选择
android·前端·ios·语音识别
2601_9617652911 小时前
【分享】PlayerPro媒体音乐播放器 完整专业版
android·媒体
JohnnyDeng9414 小时前
【Android】Android 包体积优化:R8/ProGuard 深度配置全攻略
android·性能优化·kotlin·jetpack