Мой Android AChartEngine уже работает, но как сделать так, чтобы он хорошо выглядел?

Я думаю, что название выдает большинство моих вопросов, но давайте подробнее и дадим немного предыстории:

У меня есть приложение для Android, предназначенное в основном для планшетов, которое будет отображать несколько разных данных реального -времени в TimeCharts. Итак, у меня уже есть служба для связи с источником данных, который захватывает данные, анализирует их и добавляет значения в одиночные ряды TimeSeries. Когда пользователь перемещается между фрагментами, фрагмент просто добавляет правильную временную серию и продолжает вызывать mChartView.repaint();каждые 500 мс

Все это работает и прекрасно работает с вкладками, поворотом, уведомлением и т. д.

Поскольку это приложение для планшетов, я хочу достичь двух целей :1 )максимизировать область просмотра; 2 )чтобы это выглядело хорошо.

1 )Я уже удалил кнопки масштабирования (по какой-то причине, если я попытаюсь добавить их, это даст мне исключение NullException )с mRenderer.setZoomButtonsVisible(false);, но все еще остается огромное нижнее поле, занимающее много места на экране. Я попытался установить отрицательную границу, и это сработало, но метки не перемещаются с этой границей, и я получаю, что ось X пересекает метки или даже проходит их. Как я могу переместить метки вниз с границей или, может быть, разместить их в верхней части графика?

2 )a )приложение может быть настроено пользователем для использования Holo _Dark или Holo _light. Поэтому я использую прозрачный фон в рендерере (, см. фрагмент ниже ), чтобы показать красивое затенение фона, которое делает голо. Как изменить цвет текста оси? Я нашел mRenderer.setAxesColor(color), но он меняет только строку, а не текст.

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

b )ось Y пересекает свои метки, как я могу сместить их немного влево, чтобы текст был читабельным?(это не сsetMargins())

c )когда пользователь масштабирует и перемещается по диаграмме, диаграмма прекращает обновление/повторно -масштабирует последние значения на экране, и пользователю приходится продолжать панорамирование, чтобы увидеть последние значения. Я добавил кнопку «Сбросить масштаб» на панель действий, но не могу заставить ее работать. Каким будет код для повторного обновления значений.

d )если мой TimeSeires имеет диапазон 10 минут (2 значения в секунду )как я могу сделать так, чтобы он показывал только последнюю 1 минуту (например )и если пользователь хочет предыдущие значения, он может панорамировать назад? (и кнопку использования c )re -пуск )

. на данный момент мой рендер настроен как:

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

и каждый рендеринг, добавленный в множественный рендерер, выглядит как:

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

большое спасибо за всю помощь!

Редактирую только для того, чтобы включить мой окончательный код для просмотра другими:

В итоге я полностью отказался от легенды и реализовал свою собственную легенду, плавающую над диаграммой, поэтому макет представляет собой FrameLayout с ChartView и TableLayout.

Я реализовал абстрактный класс CurvesFragment, который расширен несколькими классами.

Я настраиваю диаграмму во время моего фрагмента OnCreateView как:

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

На панели действий я добавил кнопки «Пауза/Возобновление» и «Сброс масштабирования». Сброс масштабирования прост:

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

Существует фоновая служба, которая содержит ссылки на TimeSeries, которая всегда считывает свежие данные из WiFi и добавляет их в серию. Таким образом, во фрагменте есть runnable, который выполняется каждые 700 мс и вызывает перерисовку ()как:

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

и есть ZoomListener и PanListener, которые приостанавливают график каждый раз, когда пользователь прикасается к нему. Таким образом, пользователь может масштабировать и перемещаться, но всякий раз, когда он возобновляет обновление диаграммы, он будет прокручивать только самые ранние данные без изменения уровня масштабирования.

Я предполагаю, что окончательный результат довольно солидный и хорошо смотрится как на Holo _Light, так и на Holo _Dark.

Большое спасибо ОГРОМНОЕ Дэну за ответы и всем остальным разработчикам, создавшим движок.

счастливого кодирования!

7
задан Budius 19 July 2012 в 13:47
поделиться