You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MPAndroidChart折线图的最后一个数据点显示圆点

仅在MPAndroidChart折线图最后一个数据点显示圆点的解决方案

嘿,这个需求我之前处理过好几次,用MPAndroidChart其实有两种很实用的方式可以实现,给你详细说说:


方案一:自定义渲染器(灵活可控,适合复杂场景)

这种方式通过自定义折线图的渲染器,只绘制最后一个数据点的圆点,是最灵活的方案,尤其适合你后续可能有更多自定义需求的情况。

步骤1:创建自定义渲染器类

继承LineChartRenderer,重写drawCircles方法,只处理最后一个数据点的绘制:

public class LastPointCircleRenderer extends LineChartRenderer {
    public LastPointCircleRenderer(LineDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler) {
        super(chart, animator, viewPortHandler);
    }

    @Override
    protected void drawCircles(Canvas c) {
        LineData lineData = mChart.getLineData();
        // 遍历所有数据集
        for (IDataSet set : lineData.getDataSets()) {
            if (!set.isVisible() || !set.isDrawCirclesEnabled() || set.getEntryCount() == 0) {
                continue;
            }

            // 获取最后一个数据点
            Entry lastEntry = set.getEntryForIndex(set.getEntryCount() - 1);
            if (lastEntry == null) continue;

            // 准备绘制参数
            Transformer trans = mChart.getTransformer(set.getAxisDependency());
            mCirclePaint.setColor(set.getCircleColor());
            mCirclePaint.setStrokeWidth(set.getCircleStrokeWidth());

            // 转换为屏幕坐标
            float[] position = trans.getPixelForValues(lastEntry.getX(), lastEntry.getY());
            float circleRadius = set.getCircleRadius();

            // 绘制最后一个点的圆点
            c.drawCircle(position[0], position[1], circleRadius, mCirclePaint);
        }
    }
}

步骤2:为折线图设置自定义渲染器

在你的Activity/Fragment中,初始化折线图后替换默认渲染器:

LineChart lineChart = findViewById(R.id.your_line_chart_id);
// ... 这里完成数据设置、其他基础配置(比如轴线、图例等)
// 设置自定义渲染器
LastPointCircleRenderer customRenderer = new LastPointCircleRenderer(lineChart, lineChart.getAnimator(), lineChart.getViewPortHandler());
lineChart.setRenderer(customRenderer);
lineChart.invalidate(); // 刷新图表

方案二:直接修改数据集的圆点半径(简单快捷,适合基础场景)

如果你的需求很简单,不需要额外自定义渲染逻辑,可以直接遍历数据集,把除最后一个点之外的圆点半径设为0,这样就只有最后一个点会显示圆点:

// 获取你的折线数据集(如果有多个数据集,记得循环处理每个)
LineDataSet dataSet = (LineDataSet) lineData.getDataSetByIndex(0);
// 先开启圆点绘制
dataSet.setDrawCircles(true);
// 遍历所有点,将非最后一个点的半径设为0
for (int i = 0; i < dataSet.getEntryCount() - 1; i++) {
    dataSet.setCircleRadius(i, 0f);
}
// 设置最后一个点的圆点大小(这里设为5f,你可以根据需求调整)
dataSet.setCircleRadius(dataSet.getEntryCount() - 1, 5f);
// 刷新图表
lineChart.notifyDataSetChanged();
lineChart.invalidate();

两种方案都能实现你的需求,方案一适合需要更多自定义绘制逻辑的场景,方案二更简单直接,你可以根据自己的项目情况选择~

内容的提问来源于stack exchange,提问作者Morteza Rastgoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:05:06