Android GraphView корректирует положение горизонтальных меток для круглых чисел

Я использую Android Graph View для отображения линейных графиков. Мне нужно изменить горизонтальные метки, чтобы иметь красивые округленные числа. На приложенном снимке экрана значения

1
11:15
22:29
33:44

Мне нужно отрегулировать положение горизонтальных меток и отходящих от них вертикальных линий, чтобы метки читались

0
11:00
23:00
33:44 

Код для приведенного выше снимка экрана использует этот базовый класс.

protected TextView text;
protected GraphView graph;

@Override
public View onCreateView(final LayoutInflater inflater,
                         ViewGroup container,
                         Bundle savedInstanceState)
{
    View view =  inflater.inflate(R.layout.ride_chart_fragment, null, false);

    graph = (GraphView) view.findViewById(R.id.graph);
    if (graph==null){
        Log.e("Rides","Graph should not ne null");
        return view;
    }
    Series series = linePoints();
    if (series==null) return view;


    graph.getGridLabelRenderer().setNumHorizontalLabels(4);

    graph.addSeries(series);
    setViewport(graph, series);

    text = (TextView)view.findViewById(R.id.textView);
    text.setVisibility(View.INVISIBLE);


    graph.getGridLabelRenderer().setLabelFormatter(new DefaultLabelFormatter() {
        @Override
        public String formatLabel(double value, boolean isValueX) {
            if (isValueX) {
                // show normal x values
                return UnitConverter.secondsToInterval((float) value);
            } else {

                return super.formatLabel(value, isValueX) + units(new Settings(inflater.getContext()));
            }
        }
    });

    graph.getGridLabelRenderer().setLabelVerticalWidth((int)getResources().getDimension(R.dimen.graph_label_vertical_width));
    graph.getGridLabelRenderer().setLabelHorizontalHeight((int)getResources().getDimension(R.dimen.graph_label_vertical_height));



    graph.getGridLabelRenderer().setGridColor(Color.parseColor("#20000000"));
    graph.getGridLabelRenderer().setGridStyle(GridLabelRenderer.GridStyle.BOTH);
    //graph.getGridLabelRenderer().
    return view;
}

и этот дочерний класс для отображения графика

protected Series linePoints() {

    //RideDetailActivity activity = (RideDetailActivity)getActivity();
    if (activity==null || activity.isFinishing() || activity.ride==null) return null;
    Settings settings = new Settings(activity);

    long rideId = activity.ride.sqlRide.getId();
    LezyneLinkApplication application = (LezyneLinkApplication)activity.getApplicationContext();
    DaoSession session = application.getDaoSession();
    RideElevationDao table = session.getRideElevationDao();
    List<RideElevation> elevations = table
            .queryBuilder()
            .where(RideElevationDao.Properties.RideId.eq(rideId))
            .orderAsc(RideElevationDao.Properties.Index)
            .list();
    DataPoint dataPoints[] = new DataPoint[elevations.size()];
    int index=0;
    boolean isMetric = settings.isMetric();
    for (RideElevation elevation : elevations){
        double y = elevation.getY();
        if (!settings.isMetric()){
            y = UnitConverter.convertMetersToFeet(y);
        }
        DataPoint point = new DataPoint(elevation.getX(),y);
        dataPoints[index] = point;
        index++;
    }

    LineGraphSeries series =  new LineGraphSeries<DataPoint>(dataPoints);
    series.setDrawBackground(true);
    series.setColor(Color.argb(0xFF, 0x8e, 0x00, 0xe8));
    series.setBackgroundColor(Color.argb(0x3F, 0x47, 0x2c, 0x17));
    series.setThickness(6);
    return series;
}

@Override
protected void setViewport(GraphView graph,Series series) {

    graph.getViewport().setXAxisBoundsManual(true);
    graph.getViewport().setMaxX(series.getHighestValueX());
    graph.getViewport().setYAxisBoundsManual(true);
    double lowest = series.getLowestValueY();
    double highest = series.getHighestValueY();
    graph.getViewport().setMinY(lowest);
    Settings settings = new Settings(context);
    if (settings.isMetric()){
        if (highest<lowest+121) highest = lowest+121;
    }
    else {
        if (highest<lowest+400) highest = lowest+400;
    }
    graph.getViewport().setMaxY(highest);
}

Я не вижу никакого способа сделать это с библиотекой, поэтому я рассматриваю возможность изменения исходного кода. Я что-то пропустил в API? У кого-нибудь есть какие-либо предложения о том, где в коде добавить эту функциональность.

Снимок экрана с графиком


person Marc    schedule 11.09.2015    source источник


Ответы (1)


у вас есть два пути:

1) (сложно) с динамическим окном просмотра загляните в исходный код и найдите точку, где выполняется HumanRound (GridLabelRenderer.java)

понять это и изменить ;)

2) используйте фиксированное окно просмотра и самостоятельно рассчитайте минимальные и максимальные границы, и вы можете изменить numberOfHorizontalLabels, чтобы получить наилучшее соответствие.

person appsthatmatter    schedule 12.09.2015
comment
Я бы хотел, чтобы это сработало, но numberOfHorizontalLabels очень неуклюжий. Он дает одинаковые результаты для разных чисел (при установке значения 5 получается 9 меток wth). - person duesterdust; 08.09.2020