Мой Android AChartEngine уже работает, но как сделать так, чтобы он выглядел хорошо?
Я предполагаю, что заголовок содержит большинство моих вопросов, но давайте подробно и немного предыстории:
У меня есть приложение для Android, предназначенное в основном для планшетов, которые будут отображать несколько разных данных в реальном времени в TimeCharts. Так что у меня уже есть служба для связи с источником данных, которая собирает данные, анализирует их и добавляет значения в синглтоны TimeSeries. Когда пользователь перемещается во фрагментах и выходит из них, фрагмент просто добавляет правильный TimeSeries и продолжает вызыватьmChartView.repaint();
каждые 500 мс
Все, что работает и работает хорошо на вкладках, ротации, уведомлениях и т. Д.
Поскольку это приложение для планшета, я хочу достичь двух вещей: 1) увеличить область просмотра; 2) чтобы все выглядело хорошо.
1) Я уже удалил кнопки масштабирования (по некоторым причинам, если я пытаюсь добавить их, это дает мне NullException) сmRenderer.setZoomButtonsVisible(false);
но по-прежнему огромное нижнее поле занимает много места на экране. Я попытался установить отрицательную границу, и это работает, но метки не перемещаются с этой границей, и я получаю ось X, пересекающую метки или даже пропускающую их.
Как я могу переместить метки вниз с границы, или, возможно, поместить их в верхней части графика?
2)
a) the app is user configurable to use either Holo_Dark or Holo_light. So I'm using a transparent background on the renderer (see snippet below) to show that nice background shading that holo does. How to a change the axis text color? I found the mRenderer.setAxesColor(color)
но это только изменит строку, а не текст.
int color = Color.argb(0, 255, 255, 255); // Transparent colour
mRenderer.setBackgroundColor(color);
mRenderer.setMarginsColor(color);
б) ось Y пересекает их метки, как я могу сместить их немного влево, чтобы текст был читаемым? (это не сsetMargins()
)
c) когда пользователь масштабирует и перемещается по диаграмме, диаграмма перестает обновлять / повторно масштабировать последние значения на экране, и пользователь должен продолжать панорамирование, чтобы увидеть последние значения. Я добавил «Сбросить масштаб». кнопку на панели действий, но я не могу заставить его работать. Какой будет код, чтобы значения обновлялись снова.
d) если мои TimeSeires имеют диапазон 10 минут (2 значения в секунду), как я могу сделать так, чтобы он отображал только последние 1 минуту (например), и если пользователь хочет получить предыдущие значения, которые он может откатывать назад? (и кнопку использования на c) перезапустить)
на данный момент мой рендеринг настроен как:
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);
Большое спасибо за помощь!
Editing just to include my final code for others to see:
Я закончил тем, что полностью отказался от легенды и реализовал мою собственную легенду, плавающую над диаграммой, поэтому макет представляет собой 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);
На панели действий я включил кнопки для Pause / Resume и ResetZoom. Сбросить масштаб просто:
mRenderer.setXAxisMax(-Double.MAX_VALUE);
mRenderer.setXAxisMin(Double.MAX_VALUE);
mRenderer.setYAxisMax(-Double.MAX_VALUE);
mRenderer.setYAxisMin(Double.MAX_VALUE);
mChartView.repaint();
Существует фоновая служба, которая содержит ссылки на TimeSeries, которые всегда считывают свежие данные из WiFi и добавляют их в серию. Таким образом, во фрагменте имеется исполняемый файл, выполняющийся каждые 700 мс, который вызывает repaint () как:
// 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.
СпасибоLOT для Дэна за ответы и для всех других разработчиков, которые создали двигатель.
Удачного кодирования!