Я нашел пример поворота меток точек линейного графика 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);
}
}
}