В «GraphView» ярлыки не начинаются с начала координат - PullRequest
0 голосов
/ 19 октября 2018

Я создаю 60 DataPoint (за каждую минуту в часе) и показываю их на графике.Установите 7 меток для оси х.Ярлыки с датой.

Самая левая метка и крайняя правая метка не совпадают с началом и концом оси x.На этом снимке экрана показаны несоответствия:

bugaga

Код:

private void updateGraph(){

        DataPoint[] dataPoints = new DataPoint[mCurrencyStampList.size()];
        int i = 0;

        Double minY = null;
        Double maxY = 0D;

        for(CurrencyStamp  stamp : mCurrencyStampList){
            dataPoints[i] = new DataPoint(stamp.getDate(), stamp.getClose());
            if(maxY < stamp.getClose()){
                maxY = stamp.getClose().doubleValue();
            }
            if(minY == null || minY > stamp.getClose()){
                minY = stamp.getClose().doubleValue();
            }

            i++;
        }

        LineGraphSeries<DataPoint> points = new LineGraphSeries<>(dataPoints);
        mGraphView.addSeries(points);

        DateFormat dateFormat = android.text.format.DateFormat.getTimeFormat(getContext());
        mGraphView.getGridLabelRenderer().setLabelFormatter(new DateAsXAxisLabelFormatter(getActivity(), dateFormat));
        mGraphView.getGridLabelRenderer().setTextSize(32);
        mGraphView.getGridLabelRenderer().setNumHorizontalLabels(7);

        double minX = mCurrencyStampList.get(0).getDate().getTime();
        double maxX = mCurrencyStampList.get(mCurrencyStampList.size()-1).getDate().getTime();
        mGraphView.getViewport().setMinimalViewport(minX, maxX, minY == null ? 0 : minY, maxY);
        mGraphView.getViewport().setXAxisBoundsManual(true);
        mGraphView.getViewport().setYAxisBoundsManual(true);

    }

Деления графика не совпадают во времени.Как это исправить?

обн: Мне кажется, я понимаю, почему крайние линии смещаются в центр.метка времени Unix теряет точность при преобразовании в удвоение.Я не знаю, как это исправить.Та же проблема с библиотекой Mpandroidchart.Пробую пробную версию AnyChart, у меня неплохо сработало (в конструкторе точек использовал собственный формат. Не float и double) но это пробная версия

1 Ответ

0 голосов
/ 14 ноября 2018

Я перехожу на MPAndroid и применяемый коэффициент.Просто установите минимальное и максимальное значения по оси x:

xAxis.setAxisMinimum(0);
xAxis.setAxisMaximum(100000);

Создайте коэффициент:

long xMin = mCurrencyStampList.get(0).getDate().getTime();
long xMax = mCurrencyStampList.get(mCurrencyStampList.size() - 1).getDate().getTime();
float xCoefficient = (xMax - xMin) / 100000;

Несколько значений x для различных значений:

long currentTS = s.getDate().getTime();
Float x = (currentTS - xMin) / xCoefficient;

И ввиджет отображает возвращаемое значение:

XAxis xAxis = mLineChart.getXAxis();
xAxis.setValueFormatter((value, axis) -> {
            Long time = (long) (value * xCoefficient + xMin);
            Date date = new Date(time);
            DateFormat format;
            if(mInterval == Interval.OneHour || mInterval == Interval.SixHours || mInterval == Interval.OneDay){
                format = android.text.format.DateFormat.getTimeFormat(getContext());
            }
            else {
                format = android.text.format.DateFormat.getDateFormat(getContext());
            }
            return format.format(date);
        });

не идеальное решение, но работает для метки времени Unix

...