Meine Android AChartEngine funktioniert bereits, aber wie sieht es gut aus?

Ich denke, der Titel verrät die meisten meiner Fragen, aber lassen Sie uns die Details und Hintergründe erläutern:

Ich habe eine Android-App, die hauptsächlich für Tablets gedacht ist und einige verschiedene Echtzeitdaten in TimeCharts anzeigt. Ich habe also bereits einen Dienst, um mit der Datenquelle zu kommunizieren, die die Daten erfasst, sie analysiert und die Werte zu Singletons TimeSeries hinzufügt. Wenn der Benutzer innerhalb und außerhalb von Fragmenten navigiert, fügt das Fragment einfach die richtige TimeSeries hinzu und ruft weiter aufmChartView.repaint(); alle 500ms

Alles, was funktioniert und über Registerkarten, Rotation, Benachrichtigung usw. gut funktioniert.

Da es sich um eine Tablet-App handelt, möchte ich zwei Dinge erreichen: 1) den Anzeigebereich maximieren; 2) Lass es gut aussehen.

1) Ich habe die Zoom-Schaltflächen bereits entfernt (aus irgendeinem Grund gibt es bei dem Versuch, sie hinzuzufügen, eine NullException)mRenderer.setZoomButtonsVisible(false); Aber es gibt immer noch einen riesigen unteren Rand, der viel Platz auf dem Bildschirm beansprucht. Ich habe versucht, einen negativen Rand festzulegen, aber die Beschriftungen bewegen sich nicht mit diesem Rand, und am Ende kreuzt die X-Achse die Beschriftungen oder passiert sie sogar. Wie kann ich die Beschriftungen mit dem Rand nach unten verschieben oder sie möglicherweise oben im Diagramm platzieren?

2) a) Die App kann vom Benutzer für die Verwendung von Holo_Dark oder Holo_light konfiguriert werden. Daher verwende ich einen transparenten Hintergrund im Renderer (siehe Ausschnitt unten), um die nette Hintergrundschattierung zu zeigen, die Holo macht. Wie ändere ich die Achsentextfarbe? ich fand diemRenderer.setAxesColor(color) aber es ändert nur die Zeile, nicht den Text.

    int color = Color.argb(0, 255, 255, 255); // Transparent colour
    mRenderer.setBackgroundColor(color);
    mRenderer.setMarginsColor(color);

b) Die Y-Achse überschneidet sich oben auf den Beschriftungen. Wie kann ich sie etwas nach links verschieben, damit der Text lesbar ist? (Es ist nicht mitsetMargins())

c) Wenn der Benutzer das Diagramm zoomt und schwenkt, stoppt das Diagramm das Aktualisieren / erneute Zoomen der neuesten Werte auf dem Bildschirm, und der Benutzer muss weiter schwenken, um die neuesten Werte anzuzeigen. Ich habe der ActionBar die Schaltfläche "Zoom zurücksetzen" hinzugefügt, kann sie jedoch nicht aktivieren. Was wäre der Code, um die Werte erneut zu aktualisieren.

d) Wenn meine TimeSeires einen Bereich von 10 Minuten (2 Werte pro Sekunde) haben, wie kann ich dann festlegen, dass nur die letzten 1 Minute angezeigt werden, und wenn der Benutzer die vorherigen Werte möchte, kann er zurückschwenken? (und die Verwendungstaste auf c) Neustart)

Im Moment ist mein gerendertes Setup wie folgt:

    int color = Color.argb(0, 255, 255, 255); // Transparent colour
    mRenderer.setBackgroundColor(color);
    mRenderer.setMarginsColor(color);
    mRenderer.setAxisTitleTextSize(16); // 16
    mRenderer.setChartTitleTextSize(20); // 20
    mRenderer.setLabelsTextSize(15); // 15
    mRenderer.setLegendTextSize(15); // 15
    mRenderer.setPointSize(0); // 10
    mRenderer.setMargins(new int[] { 20, 30, 15, 0 });      
    mRenderer.setZoomButtonsVisible(false);
    mRenderer.setShowAxes(true);
    mRenderer.setShowLegend(true);
    mRenderer.setShowGridX(true);
    mRenderer.setShowLabels(true);

und jedes dem Multiple Renderer hinzugefügte Rendering sieht folgendermaßen aus:

    renderer.setDisplayChartValues(false);
    mRenderer.addSeriesRenderer(renderer);

Vielen Dank für alle Hilfe!

Bearbeiten, nur um meinen endgültigen Code für andere sichtbar zu machen:

Am Ende habe ich die Legende komplett übergangen und meine eigene Legende über dem Diagramm implementiert, sodass das Layout ein FrameLayout mit einem ChartView und einem TableLayout ist.

Ich habe eine abstrakte CurvesFragment-Klasse implementiert, die um einige Klassen erweitert wurde.

Ich konfiguriere das Diagramm während meines Fragmentes OnCreateView als:

    mChartView = ChartFactory.getTimeChartView(getActivity().getApplicationContext(), mDataset, mRenderer, "HH:mm:ss"); // X axis in a time scale
    // Setup chart renderer =============================
    mRenderer.setLabelsTextSize(15); // Text size
    mRenderer.setMargins(new int[] { 0, Utils.convertToPx(5, getActivity().getApplicationContext()), 0, 0 }); // 5dp on the left to show that little line
    mRenderer.setZoomButtonsVisible(false); // bye bye zoom
    mRenderer.setShowAxes(true); // show both axes
    mRenderer.setShowLegend(false); // bye bye legend
    mRenderer.setShowGridX(true); // X grid helps identify values
    mRenderer.setShowLabels(true); // See the values
    mRenderer.setYLabelsAlign(Align.LEFT); // put the Y labels on the left of the axis
    if (Utils.getCurrentTheme(getActivity().getApplicationContext()) == android.R.style.Theme_Holo) {
        mRenderer.setXLabelsColor(getResources().getColor(android.R.color.primary_text_dark));
        mRenderer.setYLabelsColor(0, getResources().getColor(android.R.color.primary_text_dark));
        mRenderer.setMarginsColor(getResources().getColor(android.R.color.background_dark));
        legend.setBackgroundResource(R.drawable.border_dark);
    } else {
        // same as above but for Holo_light
    }
  // And from here proceed to add the TimeCharts with using
  renderer.setDisplayChartValues(false);

In meiner Aktionsleiste habe ich Schaltflächen für Pause / Resume und ResetZoom eingefügt. Der Zoom zurücksetzen ist einfach:

        mRenderer.setXAxisMax(-Double.MAX_VALUE);
        mRenderer.setXAxisMin(Double.MAX_VALUE);
        mRenderer.setYAxisMax(-Double.MAX_VALUE);
        mRenderer.setYAxisMin(Double.MAX_VALUE);
        mChartView.repaint();

Es gibt einen Hintergrunddienst mit Verweisen auf die TimeSeries, der immer neue Daten aus dem WLAN liest und sie der Serie hinzufügt. Auf diese Weise wird im Fragment alle 700 ms ein ausführbarer Befehl ausgeführt, der repaint () aufruft als:

// Chart rendering control ========================
private Runnable updateDataSet = new Runnable() {

    public void run() {
        if (!chartPaused) {

            double max = mRenderer.getXAxisMax(); // get renderer maximum value
            double min = mRenderer.getXAxisMin(); // get renderer minimum value

            // Check if the user scrolled/zoomed/panned the graph or if it's on 'auto'
            if (!((max == Double.MAX_VALUE || max == -Double.MAX_VALUE) && (min == Double.MAX_VALUE || min == -Double.MAX_VALUE))) {

                double newMax = mDataset.getSeriesAt(0).getMaxX(); // new max is the latest value from our series
                double newMin = newMax - Math.abs(max - min); // new min value is the X range the user zoomed into
                mRenderer.setXAxisMax(newMax); // set the new values
                mRenderer.setXAxisMin(newMin);
            }

            // Logic that updates the TableLayout with the legend is placed here

            mChartView.repaint();
        }

        getView().postDelayed(updateDataSet, 700);
    }
};

und es gibt einen ZoomListener und einen PanListener, die das Diagramm jedes Mal anhalten, wenn der Benutzer es berührt. Auf diese Weise kann der Benutzer zoomen und schwenken. Wenn jedoch die Aktualisierung des Diagramms fortgesetzt wird, wird nur vorwärts zu den frühesten Daten gescrollt, ohne dass die Zoomstufe geändert wird.

Ich denke, das Endergebnis ist ziemlich solide und sieht sowohl auf Holo_Light als auch auf Holo_Dark gut aus.

Danke AMENGE für Dan für die Antworten und für alle anderen Entwickler, die die Engine erstellt haben.

Fröhliches Codieren!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage