2017-09-14 2 views
0

Ich verwende MPAndroidChart (https://github.com/PhilJay/MPAndroidChart) Bibliothek eine einfache Liniendiagramm zu ziehen, wo ich eine Linie verbunden durch Punkte (Werte) haben dargestellt als Symbole.MPAndroidChart onValueSelected Symbol nur

Ich verwende 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."); 
} 

Aber in meinem Fall fast immer ich bin immer onValueSelected statt onNothingSelected, wo immer ich auf.

Also, ich bin auf einem leeren Raum klicken und noch onValueSelected Ich erhalte. Der 'e' Parameter (Entry) ist der Punkt, auf den ich geklickt habe.

Ich bin auf der Suche nach einer Lösung, um festzustellen, ob ich tatsächlich auf das Symbol im Diagramm geklickt habe oder irgendwie das onValueSelected-Verhalten geändert habe, um nur dann ausgelöst zu werden, wenn ich dies tue.

+0

Warum kann man nicht einfach den Eintrag Objekte vergleichen? –

+0

Was meinst du? Ich kann auf einen leeren Bereich klicken und dieses Ereignis auslösen. – Makalele

Antwort

1

bei diesem Beispiel Werfen Sie einen Blick ... Ihr Problem

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

    } 
} 

Achten Sie darauf, diese Zeilen Code hinzufügen ...

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

und

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

Die Methoden sind ziemlich selbsterklärend. Selbst wenn Sie benutzerdefinierte Symbole anstelle von Kreisen verwenden, können Sie mit dem "MaxH ighlightDistance "Nummer und lösen Sie Ihr Problem.

In diesem Fall wird "onValueSelected" mit "circleRadius" und "MaxHighlightDistance" als 6f nur aufgerufen, wenn der Benutzer genau auf den gezeichneten Kreis klickt. Sie können die "MaxHighlightDistance" auf 10f oder 12f einstellen, um dem Benutzer beim Klicken etwas Platz für Fehler zu geben.

+0

Danke für die Antwort! setMaxHighlightDistance ist eigentlich genug für mich, weil ich sowieso keinen Kreis zeige (nur Icon). Ich habe es auf 22 gesetzt, weil 6dp meiner Meinung nach sehr wenig ist. Es funktioniert gut. Danke noch einmal. – Makalele

Verwandte Themen