MpAndroidChart水平条形图自定义标签
我想将我的条值添加到条的左侧,将条标签添加到条的右侧 下面是初始化水平条形图的代码MpAndroidChart水平条形图自定义标签,android,graph,mpandroidchart,Android,Graph,Mpandroidchart,我想将我的条值添加到条的左侧,将条标签添加到条的右侧 下面是初始化水平条形图的代码 HorizontalBarChart mChart = (HorizontalBarChart) findViewById(R.id.chart1); mChart.setOnChartValueSelectedListener(this); mChart.setDrawBarShadow(false); mChart.setDrawValueAboveBar(true);
HorizontalBarChart mChart = (HorizontalBarChart) findViewById(R.id.chart1);
mChart.setOnChartValueSelectedListener(this);
mChart.setDrawBarShadow(false);
mChart.setDrawValueAboveBar(true);
mChart.setDescription(strHeading);
mChart.setMaxVisibleValueCount(60);
mChart.setPinchZoom(false);
mChart.setDrawGridBackground(false);
XAxis xl = mChart.getXAxis();
xl.setDrawLabels(false);
YAxis yl = mChart.getAxisLeft();
yl.setDrawLabels(false);
YAxis yr = mChart.getAxisRight();
yr.setTypeface(mTfLight);
yr.setDrawAxisLine(true);
yr.setDrawGridLines(false);
setData(12, 50);
mChart.setFitBars(true);
mChart.animateY(2500);
mChart.getXAxis().setPosition(XAxis.XAxisPosition.BOTTOM_INSIDE);
Legend l = mChart.getLegend();
l.setPosition(Legend.LegendPosition.ABOVE_CHART_LEFT);
l.setFormSize(8f);
l.setXEntrySpace(4f);
下面是绑定数据的方法,代码如下
float barWidth = 9f;
float spaceForBar = 10f;
ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry>();
for (int i=0 ; i< arrayChart.size(); i++){
ModelChart modelChart = arrayChart.get(i);
String aString = modelChart.getHeader();
float space = i * spaceForBar;
BarEntry eachEntry = new BarEntry(i * spaceForBar, modelChart.getValue() , modelChart.getHeader());
yVals1.add(eachEntry);
}
if (mChart.getData() != null &&
mChart.getData().getDataSetCount() > 0) {
BarDataSet set1 = (BarDataSet)mChart.getData().getDataSetByIndex(0);
set1.setValues(yVals1);
mChart.getData().notifyDataChanged();
mChart.notifyDataSetChanged();
} else {
set1 = new BarDataSet(yVals1, "A , B , C");
ArrayList<IBarDataSet> dataSets = new ArrayList<IBarDataSet>();
dataSets.add(set1);
BarData data = new BarData(dataSets);
data.setValueTextSize(10f);
data.setValueTypeface(mTfLight);
data.setBarWidth(barWidth);
mChart.setData(data);
}
浮动条宽度=9f;
float spaceForBar=10f;
ArrayList yVals1=新的ArrayList();
对于(int i=0;i0){
BarDataSet set1=(BarDataSet)mChart.getData().getDataSetByIndex(0);
set1.setValues(yVals1);
mChart.getData().notifyDataChanged();
mChart.notifyDataSetChanged();
}否则{
set1=新的数据集(yVals1,“A,B,C”);
ArrayList数据集=新的ArrayList();
数据集.add(set1);
BarData数据=新的BarData(数据集);
data.setValueTextSize(10f);
data.setValueTypeface(mTfLight);
数据.立根宽度(条形宽度);
mChart.setData(数据);
}
是的,使用ValueFormatter
和AxisValueFormatter
接口,这是完全可能的
public class LabelFormatter implements ValueFormatter {
@Override
public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
// assuming that getHeader() returned the label
return (String) entry.getData();
}
}
public class BarValueFormatter implements AxisValueFormatter {
private final DataSet mData;
public BarValueFormatter(DataSet data) {
mData = data;
}
@Override
public String getFormattedValue(float value, AxisBase axis) {
return String.valueOf((int) mData.getEntryForXPos(value, DataSet.Rounding.CLOSEST).getY());
}
}
public class LabelFormatter implements ValueFormatter {
@Override
public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
// assuming that getHeader() returned the label
return (String) entry.getData();
}
}
public class BarValueFormatter implements AxisValueFormatter {
private final DataSet mData;
public BarValueFormatter(DataSet data) {
mData = data;
}
@Override
public String getFormattedValue(float value, AxisBase axis) {
return String.valueOf((int) mData.getEntryForXPos(value, DataSet.Rounding.CLOSEST).getY());
}
}
set1.setValueFormatter(new LabelFormatter());
mChart.getXAxis().setValueFormatter(new BarValueFormatter(set1));
注意,您需要删除对
xl.setDrawLabels(false)的调用编码>用于x轴,以便正确呈现值。是的,使用ValueFormatter
和AxisValueFormatter
接口绝对可以实现这一点
创建将标签添加到条形图右侧的格式设置程序:
public class LabelFormatter implements ValueFormatter {
@Override
public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
// assuming that getHeader() returned the label
return (String) entry.getData();
}
}
public class BarValueFormatter implements AxisValueFormatter {
private final DataSet mData;
public BarValueFormatter(DataSet data) {
mData = data;
}
@Override
public String getFormattedValue(float value, AxisBase axis) {
return String.valueOf((int) mData.getEntryForXPos(value, DataSet.Rounding.CLOSEST).getY());
}
}
创建将值添加到条形图左侧的轴格式化程序:
public class LabelFormatter implements ValueFormatter {
@Override
public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
// assuming that getHeader() returned the label
return (String) entry.getData();
}
}
public class BarValueFormatter implements AxisValueFormatter {
private final DataSet mData;
public BarValueFormatter(DataSet data) {
mData = data;
}
@Override
public String getFormattedValue(float value, AxisBase axis) {
return String.valueOf((int) mData.getEntryForXPos(value, DataSet.Rounding.CLOSEST).getY());
}
}
将格式化程序设置为数据集和轴:
set1.setValueFormatter(new LabelFormatter());
mChart.getXAxis().setValueFormatter(new BarValueFormatter(set1));
注意,您需要删除对xl.setDrawLabels(false)的调用代码>用于x轴,因此值被正确渲染。是您的自定义组件吗?嘿@Yasir Ali,我使用了HorizontalBarchart我检查了库代码这并不容易,但我尽力向您解释。他们有HorizontalBarChartRenderer.java,它负责渲染条形图,drawValues方法负责此文本渲染。您可以做什么来覆盖此方法并以某种方式覆盖HorizontalBarChart.init,它设置HorizontalBarChartRenderer和默认渲染器。这有意义吗?如果您有这个as库,那么只需更改HorizontalBarChartRe即可nderer.drawValues.这是您的自定义组件吗?嘿@Yasir Ali,我已经使用了HorizontalBarchart我检查了库代码这并不容易,但我尽力向您解释。他们有HorizontalBarChartRenderer.java,它负责渲染条形图,drawValues方法负责此文本渲染。您可以做什么来覆盖此方法并以某种方式覆盖HorizontalBarChart.init,它设置HorizontalBarChartRenderer和默认渲染器。这有意义吗?如果您有这个as库,那么只需更改HorizontalBarChartRe即可我得到getEntryForXPos的“无法解析方法”,该方法来自何处?@neo方法名称在v3.0.0更新中已更改。请尝试getEntryForXValue(值,0f,DataSet.Rounding.CLOSEST)
。我得到getEntryForXPos的“无法解析方法”,该方法来自何处?@neo方法名称在v3.0.0更新中已更改。尝试getEntryForXValue(值,0f,数据集.舍入.最近)
。