仅 MPAndroidChart onValueSelected 图标

MPAndroidChart onValueSelected icon only

我正在使用 MPAndroidChart (https://github.com/PhilJay/MPAndroidChart) 库绘制一个简单的折线图,其中我有一条由点(值)连接的线,用图标表示。

我正在使用 OnChartValueSelectedListener:

//initialization
mChart.setOnChartValueSelectedListener(this);

//later in class
public void onValueSelected(Entry e, Highlight h){
    Log.i(TAG, "Something selected.");
}

@Override
public void onNothingSelected() {
    Log.i(TAG, "Nothing selected.");
}

但就我而言,无论我点击什么,我几乎总是得到 onValueSelected 而不是 onNothingSelected。

因此,我单击了一个空的 space,但我仍然得到 onValueSelected。 'e' 参数 (Entry) 是离我点击的点最近的一个。

我正在寻找一种解决方案来检测我是否真的点击了图表上的图标或以某种方式更改 onValueSelected 行为以仅在我这样做时引发。

看看这个例子...应该可以解决您的问题

public class MpAndroidLineChartActivity extends AppCompatActivity {

    LineChart mChart;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mp_android_line_chart);

        mChart = (LineChart) findViewById(R.id.bar_chart);
        mChart.getDescription().setEnabled(false);
        mChart.setPinchZoom(false);
        mChart.setDrawGridBackground(false);

        XAxis xAxis = mChart.getXAxis();
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        xAxis.setDrawGridLines(false);

        YAxis leftAxis = mChart.getAxisLeft();
        leftAxis.setDrawGridLines(false);
        leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);

        mChart.getAxisRight().setEnabled(false);
        mChart.getLegend().setEnabled(false);

        float[] val = {10, 20, 30, 40, 50};

        ArrayList<Entry> entryList = new ArrayList<>();
        for (int i = 0; i < val.length; i++) {
            entryList.add(new BarEntry(i, val[i]));
        }

        LineDataSet set1 = new LineDataSet(entryList, "entryList");
        set1.setColor(Color.BLUE);

        set1.setDrawValues(false);
        set1.setColor(Color.BLACK);
        set1.setCircleColor(Color.BLACK);
        set1.setCircleRadius(6f);
        set1.setDrawCircleHole(false);

        ArrayList<ILineDataSet> dataSets = new ArrayList<ILineDataSet>();
        dataSets.add(set1);
        LineData data = new LineData(dataSets);
        mChart.setData(data);
        mChart.setScaleEnabled(false);
        mChart.invalidate();
        mChart.setMaxHighlightDistance(6f);

        mChart.setOnChartValueSelectedListener(new OnChartValueSelectedListener() {
            @Override
            public void onValueSelected(Entry e, Highlight h) {
                Log.d("onValueSelected", "onValueSelected");
            }

            @Override
            public void onNothingSelected() {
                Log.d("onNothingSelected", "onNothingSelected");
            }
        });

    }
}

确保将这些行添加到您的代码中...

//Sets the radius of the drawn circles.
  set1.setCircleRadius(6f);

//Sets the maximum distance in screen dp a touch can be away from an entry to cause it to get highlighted.
mChart.setMaxHighlightDistance(6f);

这些方法几乎都是自学的 explanatory.Even 如果您使用自定义图标代替圆圈,您可以尝试使用 "MaxHighlightDistance" 数字来解决您的问题。

在这种情况下,"circleRadius" 和 "MaxHighlightDistance" 都为 6f,仅当用户准确单击绘制的圆时才会调用 "onValueSelected"。您可以将 "MaxHighlightDistance" 调整为 10f 或 12f,以便在单击时为用户提供一些出错空间。