MPAndroidChart仅限onValueSelected图标

时间:2017-09-14 17:31:13

标签: android mpandroidchart

我正在使用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。

所以,我点击一个空白的空间,然后我仍然选择了值。 ' e' param(Entry)是我点击的最接近的一个。

我正在寻找一个解决方案,以检测我是否真的点击了图表上的图标,或者以某种方式改变了onValueSelected行为,只有在我这样做时才会提出。

1 个答案:

答案 0 :(得分:1)

看看这个例子......应该解决你的问题

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);

这些方法非常自我解释。即使您使用自定义图标代替圆圈,也可以使用&#34; MaxHighlightDistance&#34;编号并解决您的问题。

在这种情况下,使用&#34; circleRadius&#34;和&#34; MaxHighlightDistance&#34; as 6f,&#34; onValueSelected&#34;仅在用户完全点击绘制的圆圈时才会调用。你可以调整&#34; MaxHighlightDistance&#34;到10f或12f,以便在点击时给用户一些错误的空间。