Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MpAndroidChart水平条形图自定义标签_Android_Graph_Mpandroidchart - Fatal编程技术网

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,数据集.舍入.最近)