AndroidPlot: адаптация поворота метки точки от линейного графика XYPlot к гистограмме XYPlot - PullRequest
0 голосов
/ 28 апреля 2020

Я нашел пример поворота меток точек линейного графика Androidplot на Как повернуть текстовое значение на графике ,

(спасибо, Ник!), И я пытаюсь адаптировать этот код для гистограммы, которая использует другой рендер и форматер, который я должен настроить. Настроенный код выполняется, но столбцы не отображаются. Я думаю, что это связано с неправильными координатами X и Y. Исходный пример линейного графика Ника получает эти значения из массива «точек», который, по-видимому, недоступен в средстве визуализации гистограммы.

Код настройки:

    MyBarRenderer.MyBarFormatter bfBudget = new MyBarRenderer.MyBarFormatter(Color.GREEN, Color.WHITE);
    PointLabelFormatter plfBudget = new PointLabelFormatter();
    plfBudget.getTextPaint().setTextSize(18);
    plfBudget.getTextPaint().setColor(Color.GREEN);
    bfBudget.setPointLabelFormatter(plfBudget);
    bfBudget.setPointLabeler(new PointLabeler()
    {
        @Override
        public String getLabel(XYSeries series, int index)
        {
            Number value = series.getY(index);
            String str = df.format(value.doubleValue());
            if (index > 0)
            {
                Number prevValue = series.getY(index - 1);
                if (value.doubleValue() != prevValue.doubleValue())
                {
                    str = df.format(value.doubleValue());
                }
                else
                {
                    str = "";
                }
            }
            return str;
        }
    });
    bar.addSeries(budgetBar, bfBudget);

/**
 * A BarRenderer that rotates it's point labels -90 degrees.
 */
static class MyBarRenderer extends BarRenderer<MyBarRenderer.MyBarFormatter>
{

    public MyBarRenderer(XYPlot plot)
    {
        super(plot);
    }
    /*
    Bar graph onRender entry interface:
    public void onRender(android.graphics.Canvas canvas,
                 android.graphics.RectF plotArea,
                 java.util.List<SeriesBundle<XYSeries,? extends FormatterType>> sfList,
                 int seriesSize,
                 RenderStack stack)
     */

    // Basically just copy the entire renderPoints implementation and add a rotation as shown below
    @Override
    public void onRender(Canvas canvas, RectF plotArea, List<SeriesBundle<XYSeries, ? extends MyBarFormatter>> sfList, int seriesSize, RenderStack stack)
    {
        ArrayList<RenderStack.StackElement> elements = stack.getElements();
        RenderStack.StackElement budgetElement = elements.get(0);
        SeriesBundle budgetSeriesBundle = budgetElement.get();
        SimpleXYSeries budgetSeries = (SimpleXYSeries) budgetSeriesBundle.getSeries();
        MyBarFormatter formatter = (MyBarFormatter) budgetSeriesBundle.getFormatter();
        boolean hasVp = formatter.hasVertexPaint();
        boolean hasPlf = formatter.hasPointLabelFormatter();

        if (hasVp || hasPlf)
        {
            final Paint vertexPaint = formatter.hasVertexPaint() ? formatter.getVertexPaint() : null;
            final boolean hasPointLabelFormatter = formatter.hasPointLabelFormatter();
            final PointLabelFormatter plf = hasPointLabelFormatter ? formatter.getPointLabelFormatter() : null;
            final PointLabeler pointLabeler = hasPointLabelFormatter ? formatter.getPointLabeler() : null;
            int n = 1;

            for (int i = 0; i < budgetSeries.size(); i++)
            {
                Number x = budgetSeries.getX(i);
                Number y = budgetSeries.getY(i);

                if (vertexPaint != null) {
                    canvas.drawPoint(x.floatValue(), y.floatValue(), vertexPaint);
                }

                if (pointLabeler != null)
                {
                    // this is where we rotate the text:
                    final int canvasState = canvas.save();
                    try
                    {
                        canvas.rotate(-90, x.floatValue(), y.floatValue());
                        String label = pointLabeler.getLabel(budgetSeries, i);
                        canvas.drawText(label,
                                plf.hOffset, plf.vOffset, plf.getTextPaint());
                    }
                    finally
                    {
                        canvas.restoreToCount(canvasState);
                    }
                }
            }
        }
    }

    static class MyBarFormatter extends BarFormatter
    {

        // if you dont use configurator you can omit this constructor.  this example uses it
        // tho so here it is.
        public MyBarFormatter(int color1, int color2)
        {
            super(color1, color2);
        }

        @Override
        public Class<? extends SeriesRenderer> getRendererClass()
        {
            return MyBarRenderer.class;
        }

        @Override
        public SeriesRenderer doGetRendererInstance(XYPlot plot)
        {
            return new MyBarRenderer(plot);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...