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

如何禁止MPAndroidChart中点击已标记数值时隐藏标记视图?

解决MPAndroidChart多Marker误触后全部消失的问题

问题根源

MPAndroidChart默认开启highlightPerTapEnabled(默认值为true),当点击已处于高亮状态的点时,图表会自动清空所有高亮标记,直接覆盖了你维护的highlightList逻辑,最终导致所有Marker消失。

解决方案

1. 禁用图表默认的点击取消高亮行为

在初始化图表时添加以下代码,阻止默认的自动清空高亮逻辑:

binding.chart.setHighlightPerTapEnabled(false);

2. 修正onValueSelected逻辑(仅操作目标高亮项)

你的现有代码已经在维护highlightList,但需要确保每次更新高亮时完全基于自定义列表,不受默认行为干扰。调整后的代码如下:

@Override
public void onValueSelected(Entry e, Highlight h) {
    boolean isExist = false;
    int targetIndex = -1;

    // 遍历查找是否已存在该高亮项
    for (int i = 0; i < highlightList.size(); i++) {
        Highlight existing = highlightList.get(i);
        // 浮点数比较用精度判断避免误差
        if (Math.abs(existing.getX() - h.getX()) < 0.0001 
            && Math.abs(existing.getY() - h.getY()) < 0.0001) {
            isExist = true;
            targetIndex = i;
            break;
        }
    }

    if (isExist) {
        // 仅移除当前点击的高亮项
        highlightList.remove(targetIndex);
    } else {
        // 添加新高亮项并控制最大数量
        highlightList.add(h);
        if (highlightList.size() > activity.settings.getMaxCountOfMarker()) {
            highlightList.remove(0);
        }
    }

    // 基于自定义列表设置高亮
    Highlight[] highlights = highlightList.toArray(new Highlight[0]);
    binding.chart.highlightValues(highlights);
}

3. 优化onNothingSelected(可选)

如果需要点击图表空白区域时保留所有Marker,保持onNothingSelected为空实现即可,不要调用binding.chart.highlightValues(null)(默认点击空白会清空高亮)。

关键说明

  • setHighlightPerTapEnabled(false)是核心:它让自定义高亮列表逻辑完全主导显示,避免默认行为清空所有标记。
  • 浮点数精度判断:直接用==对比X/Y值可能因浮点误差出现误判,用Math.abs加误差范围更可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 01:46:29