Mein Android AChartEngine ist bereits in Arbeit, aber wie machen es gut Aussehen?

Ich denke der Titel verrät, die meisten meiner Fragen, aber lassen Sie ' s detail und ein wenig hintergrund:

Habe ich eine Android-app ist hauptsächlich für tablets sein, mit ein paar verschiedenen Echtzeit-Daten in TimeCharts. Also ich habe schon einen Dienst für die Kommunikation mit der Datenquelle, der packt die Daten, analysieren Sie diese und fügen Sie die Werte singletons TimeSeries. Wenn der Benutzer navigiert in die und aus der Fragmente-fragment fügt einfach die richtigen TimeSeries und hält ruft mChartView.repaint(); alle 500 MS

Allen, die in Betrieb ist und die arbeiten gut über Tabulatoren, Drehung, Benachrichtigung, usw.

Weil es eine tablet-app, die ich erreichen möchte sind zwei Dinge: 1) Maximierung der Bildfläche; 2) sieht es gut aus.

1) habe ich bereits entfernt, die zoom-Schaltflächen (aus irgendeinem Grund, wenn ich versuche, fügen Sie Sie es gibt mir NullException) mit mRenderer.setZoomButtonsVisible(false); aber es gibt immer noch eine große untere Rand nimmt viel Platz auf dem Bildschirm. Ich habe versucht, eine negative Grenze, und es funktioniert, aber die labels bewegen sich nicht mit dieser Grenze und ich am Ende mit der X-Achse überqueren, über die labels oder sogar übergeben.
Wie kann ich verschieben, die Etiketten unten mit der Grenze, oder vielleicht legte Sie auf den oberen Rand der Grafik?

2)
a) die app ist vom Benutzer konfigurierbar, um entweder Holo_Dark oder Holo_light. Also ich bin mit einem transparenten hintergrund auf dem renderer (siehe snippet unten), um zu zeigen, dass schöne Schattierung, dass holo nicht. Wie eine änderung der Achse text Farbe? Ich fand die mRenderer.setAxesColor(color) aber nur die Zeile ändern, nicht den text.

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

b) die Y-Achse kreuzt oben drauf mit den Beschriftungen, wie kann ich Ausgleich Sie ein bisschen nach Links, so dass der text lesbar ist? (es ist nicht mit setMargins())

c) wenn der Benutzer die zoom-und verschieben Sie das Diagramm, das Diagramm beendet die Aktualisierung/re-Zoomen der aktuellen Werte auf dem Bildschirm und den Benutzer zu halten haben schwenken, um die aktuellen Werte. Ich fügte hinzu, ein "Reset Zoom" - button in der ActionBar, aber ich kann nicht damit es funktioniert. Was wäre der code, um die Werte wieder ein update.

d) wenn meine TimeSeires haben eine Reihe von 10min (2 Werte pro Sekunde), wie kann ich es machen das nur die letzten 1min (zum Beispiel) und wenn der Benutzer möchte die vorherigen Werte kann er die Pfanne zurück? (und die benutzen-Taste auf c) re-start)

im moment ist meine gerendert-setup als:

    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 jede gerendert Hinzugefügt, die Mehrere renderer geht wie:

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

vielen Dank für alle Hilfe!

Bearbeitung nur auf meine endgültige code für andere zu sehen:

Hab ich endete Notwasserung die Legende komplett und Umsetzung meiner eigenen Legende schwebt über der Grafik, so dass das layout ein FrameLayout mit ChartView und ein TableLayout.

Ich implementiert eine abstrakte CurvesFragment-Klasse, die erweitert wird durch ein paar Klassen.

Ich konfigurieren das Diagramm während meiner fragment 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);

Auf meine action bar habe ich Tasten für Pause/Resume und ResetZoom.
der Reset Zoom ist einfach:

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

Gibt es einen hintergrund-Dienst, der hält Referenzen zu TimeSeries, die immer Lesen neue Daten, die vom WiFi und fügen Sie diese in die Serie. So, in den fragment-gibt es ein Thread der Ausführung jeder 700ms, dass Aufrufe von repaint() 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 eine ZoomListener und ein PanListener, hält das Diagramm jedes mal, wenn der Benutzer Sie berührt. So kann der Nutzer Zoomen und schwenken, um, aber immer, wenn es fortgesetzt wird das Diagramm aktualisiert, es wird nur navigieren Sie vorwärts, um die ältesten Daten ohne änderung der zoom-Stufe.

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

Vielen Dank VIEL für Dan für die Antworten und für alle anderen Entwickler, der die engine.

happy coding!

InformationsquelleAutor Budius | 2012-07-03
Schreibe einen Kommentar