Пользовательские установки для столбцов со значениями
Я использую библиотеку MPAndroidChart для создания гистограмм.
Мы можем использовать следующее, чтобы показать значения бара в верхней части бара.
mChart.setDrawValueAboveBar(false);
Или мы можем использовать это :
barDataSet.setDrawValues(true);
Для отображения значений бара внутри самого бара. Я хочу знать, можем ли мы установить пользовательскую позицию для значений. Например, ниже оси Y.
Решение
public class TextBarChartRenderer extends BarChartRenderer {
public TextBarChartRenderer(BarDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler) {
super(chart, animator, viewPortHandler);
}
@Override
public void drawValues(Canvas c) {
List<IBarDataSet> dataSets = mChart.getBarData().getDataSets();
final float valueOffsetPlus = Utils.convertDpToPixel(22f)
float negOffset;
for (int i = 0; i < mChart.getBarData().getDataSetCount(); i++) {
IBarDataSet dataSet = dataSets.get(i);
applyValueTextStyle(dataSet);
float valueTextHeight = Utils.calcTextHeight(mValuePaint, "8");
negOffset = valueTextHeight + valueOffsetPlus;
BarBuffer buffer = mBarBuffers[i];
float left;
float right;
float top;
float bottom;
for (int j = 0; j < buffer.buffer.length * mAnimator.getPhaseX(); j += 4) {
left = buffer.buffer[j];
right = buffer.buffer[j + 2];
top = buffer.buffer[j + 1];
bottom = buffer.buffer[j + 3];
float x = (left + right) / 2f;
if (!mViewPortHandler.isInBoundsRight(x))
break;
if (!mViewPortHandler.isInBoundsY(top) || !mViewPortHandler.isInBoundsLeft(x))
continue;
BarEntry entry = dataSet.getEntryForIndex(j / 4);
float val = entry.getY();
if(val > 0) {
drawValue(c, dataSet.getValueFormatter(), val, entry, i, x,
(bottom + negOffset),
dataSet.getValueTextColor(j / 4));
}
}
}
}
}
Также пришлось добавить это, чтобы значения были видимый
mChart.setExtraOffsets(0, 0, 0, 20);
1 ответ:
В API нет метода, позволяющего изменить положение меток значений на положение ниже оси YAxis. Вероятно, вам придется расширить и модифицировать библиотеку, чтобы удовлетворить ваши необычные требования.
Один из вариантов, чтобы попытаться было бы реализовать
IAxisValueFormatter
на оси X для отображения y-значений вместо x-значений. Простой пример может повторно использовать существующийIndexAxisValueFormatter
. Допустим, у вас есть метки для y-значений вString []
, называемомyLabels
. Теперь вы можете сделать следующее:mChart.getXAxis().setValueFormatter(new IndexAxisValueFormatter(yLabels));
Если это не работает, вам придется посмотреть на источник для
BarChartRenderer
. Существует метод под названиемdrawValues()
, который можно переопределить для достижения нужного эффекта.Таким образом, у вас будет что-то вроде:
public class MyBarChartRenderer extends BarChartRenderer { //TODO: a constructor matching the superclass @Override public void drawValues(Canvas c) { //TODO: copy and paste the code from the superclass and simply //change the offset for drawing the labels } }