Я столкнулся с некоторыми странными проблемами с моим (Line) GraphView!
Чтобы объяснить это немного лучше, я добавлю картинку, которая показывает, что происходит, когда я начинаю прокручивать по горизонтали (вертикальная прокрутка не нужна).
Дело в том, что:
Точки данных отображаются правильно, но не мои метки! Я написал правильную метку красного цвета на картинках выше!
Всякий раз, когда я начинаю прокручивать, ярлыки начинают странно "прыгать".
DataPoints получены из файла SharedPreference с парами String / Integer [Строки всегда MMMyyyy (например, "Mar2020")]
Я получаю пары из моего SP-файла, помещаю строки в качестве статических меток в мой график, используя DataPoints таким «логическим» образом (не реальный код!)
DataPoint[0] = (0, valueOfKey0)
DataPoint[1] = (1, valueOfKey1)
Вот код, как график вызывается / рисуется в Деятельности
private void setupGraph(final GraphView graph, String subName){
GraphDataHelper graphDataHelper = new GraphDataHelper(mContext);
LineGraphSeries<DataPoint> series;
/*Have to call .removeAllSeries to draw each graph individually
* Otherwise they will be drawn over another!*/
graph.removeAllSeries();
/*Gets Values from each Sub
* --> Gets values form each key/value pair of specific SharedPreference-file
* --> sets values in order (0, 1, 2,... n)*/
series = new LineGraphSeries<DataPoint>(graphDataHelper.generateGraphData(subName));
series.setDrawDataPoints(true);
series.setColor(getResources().getColor(R.color.casualWhite));
series.setAnimated(true);
graph.addSeries(series);
/*Fill Labels for X-Axis:
* Get the specific Monthly-Keys for the choosen Sub
* In special cases extra rules are declared in .getSpecificSubMonthKeys() method
* Put all entries of ArrayList in Array (StaticLabelsFormatter only works with "normal" Array)*/
ArrayList<String> array_paths = graphDataHelper.getSpecificSubMonthKeys(subName);
int size = array_paths.size();
String[] paths = new String[size];
for (int i=0; i<size; i++){
paths[i] = array_paths.get(i);
}
StaticLabelsFormatter staticLabelsFormatter = new StaticLabelsFormatter(graph);
staticLabelsFormatter.setHorizontalLabels(paths);
graph.getGridLabelRenderer().setLabelFormatter(staticLabelsFormatter);
graph.getViewport().setXAxisBoundsManual(true);
if(size == 5 || size > 5){
graph.getViewport().setMinX(0.0);
graph.getViewport().setMaxX(4.0);
graph.getGridLabelRenderer().setNumHorizontalLabels(5);
} else if(size == 4){
graph.getViewport().setMinX(0.0);
graph.getViewport().setMaxX(3.0);
graph.getGridLabelRenderer().setNumHorizontalLabels(4);
} else if(size == 3){
graph.getViewport().setMinX(0.0);
graph.getViewport().setMaxX(2.0);
graph.getGridLabelRenderer().setNumHorizontalLabels(3);
} else if(size == 2){
graph.getViewport().setMinX(0.0);
graph.getViewport().setMaxX(1.0);
graph.getGridLabelRenderer().setNumHorizontalLabels(2);
}
graph.getViewport().setScrollable(true);
graph.getGridLabelRenderer().setHorizontalLabelsColor(getResources().getColor(R.color.midBlue));
graph.getGridLabelRenderer().setVerticalLabelsColor(getResources().getColor(R.color.midBlue));
graph.getGridLabelRenderer().setGridColor(getResources().getColor(R.color.darkBlue));
graph.getGridLabelRenderer().setPadding(50);
graph.getGridLabelRenderer().setLabelsSpace(30);
Я призываю .removeAllSeries, потому что Пользователь может вызвать другой график через выпадающий Spinner.
Также я установил разные точки MinX и MaxX, потому что может быть случай, когда запись еще не имеет 5 DataPoints, и поэтому я изменяю область просмотра в связи с этим (не нашел лучшего решения для этого, поэтому я также открыт для некоторого лучшего кода здесь, но это работает таким образом). Мой SharedPreference-файл всегда имеет минимум 2 пары ключ / значение
Также небольшой дополнительный вопрос: есть ли способ дать ТОЛЬКО горизонтальным меткам дополнительное пространство для меток. Если я использую setLabelSpace, это также будет применяться к вертикальным меткам, и я не хочу этого Но горизонтальные метки расположены так близко к оси.
Также извините за уродливый код. Я впервые использовал GraphView!
Спасибо, вперед!