如何禁止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
相关产品推荐
相关产品推荐

