Mój Android AChartEngine już działa, ale jak sprawić, by wyglądał dobrze?

Wydaje mi się, że tytuł oddaje większość moich pytań, ale doprecyzujmy i dajmy trochę tła:

Mam aplikację na Androida skoncentrowaną głównie na tabletach, które będą wyświetlać kilka różnych danych w czasie rzeczywistym w TimeCharts. Mam więc już usługę do komunikowania się ze źródłem danych, które pobiera dane, analizuje je i dodaje wartości do singletonów TimeSeries. Gdy użytkownik nawiguje między fragmentami, fragment po prostu dodaje poprawne TimeSeries i wciąż dzwonimChartView.repaint(); co 500ms

Wszystko, co działa i działa dobrze na kartach, rotacji, powiadomieniach itp.

Ponieważ jest to aplikacja na tablet, chcę osiągnąć dwie rzeczy: 1) zmaksymalizować obszar wyświetlania; 2) sprawi, że będzie dobrze wyglądać.

1) Usunąłem już przyciski zoomu (z jakiegoś powodu, jeśli próbuję je dodać, daje mi to NullException)mRenderer.setZoomButtonsVisible(false); ale nadal jest ogromny margines dolny, który zajmuje dużo miejsca na ekranie. Próbowałem ustawić obramowanie ujemne i działa, ale etykiety nie przesuwają się wraz z tą krawędzią i kończę na osi X przecinającej etykiety lub nawet je przesuwającej. Jak mogę przenieść etykiety w dół z obramowaniem, a może umieścić je na górze wykresu?

2) a) aplikacja może być konfigurowana przez użytkownika, aby używać Holo_Dark lub Holo_light. Używam więc przezroczystego tła na rendererze (patrz fragment poniżej), aby pokazać ładne cieniowanie tła, które robi holo. Jak zmienić kolor tekstu osi? znalazłemmRenderer.setAxesColor(color) ale zmienia tylko linię, nie tekst.

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

b) oś Y przecina etykiety, jak mogę je przesunąć nieco w lewo, aby tekst był czytelny? (nie jest zsetMargins())

c) gdy użytkownik powiększy i przesunie wokół wykresu, wykres przestanie aktualizować / ponownie powiększać najnowsze wartości na ekranie, a użytkownik musi ciągle przesuwać, aby zobaczyć najnowsze wartości. Dodałem przycisk „Resetuj powiększenie” na pasku akcji, ale nie mogę go uruchomić. Jaki byłby kod, który sprawi, że wartości zostaną zaktualizowane ponownie.

d) jeśli moje TimeSeires mają zakres 10min (2 wartości na sekundę), jak mogę sprawić, aby pokazywał tylko ostatnie 1min (na przykład) i jeśli użytkownik chce mieć poprzednie wartości, może cofnąć się? (i przycisk użycia na c) ponowne uruchomienie)

w tej chwili moje renderowanie jest ustawiane jako:

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

a każdy renderowany dodany do renderera wielokrotnego wygląda następująco:

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

wielkie dzięki za pomoc!

Edycja tylko po to, by dołączyć mój ostatni kod, aby inni mogli go zobaczyć:

Skończyło się na całkowitym zrzuceniu legendy i wdrożeniu własnej legendy unoszącej się nad wykresem, więc układem jest FrameLayout z ChartView i TableLayout.

Zaimplementowałem abstrakcyjną klasę CurvesFragment rozszerzoną o kilka klas.

Konfiguruję wykres podczas mojego fragmentu OnCreateView jako:

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

Na moim pasku akcji umieściłem przyciski Pause / Resume i ResetZoom. Resetuj zoom jest prosty:

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

Dostępna jest usługa w tle, która zawiera odniesienia do TimeSeries, które zawsze odczytują świeże dane z WiFi i dodają je do serii. W ten sposób we fragmencie jest uruchamialne uruchamianie co 700 ms, które wywołuje repaint () jako:

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

jest też ZoomListener i PanListener, który zatrzymuje wykres za każdym razem, gdy użytkownik go dotyka. W ten sposób użytkownik może powiększać i przesuwać obraz, ale za każdym razem, gdy wznawia aktualizację wykresu, przewija tylko do najwcześniejszych danych bez zmiany poziomu powiększenia.

Myślę, że końcowy wynik jest całkiem solidny i ładnie wygląda zarówno na Holo_Light, jak i Holo_Dark.

DziękiLOS dla Dana po odpowiedzi i dla wszystkich innych twórców, którzy stworzyli silnik.

szczęśliwe kodowanie!

questionAnswers(2)

yourAnswerToTheQuestion