MPAndroidChart带有不同条形宽度的条形图

3
我需要创建一个图表,以时间为x轴,面积为y轴。该程序将在一定的时间差记录活动数据并在图表中显示数据,类似于这个-> https://istack.dev59.com/s4MiC.webp 但是每两个柱之间的颜色会交替以对应不同的活动。我尚未找到使用MPAndroidChart实现此操作的方法,每个条目似乎都有固定的宽度。如果有人知道如何使用MPAndroidChart或其他开源库来实现此功能,将不胜感激,谢谢!
编辑: 这是我一直在努力处理的代码:
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_data_report);  

    BarChart barChart = (BarChart) findViewById(R.id.barChart);
    List<BarEntry> entries = generateBarEntries();
    BarDataSet set = new BarDataSet(entries, "BarDataSet");
    BarData data = new BarData(set);
    barChart.setData(data);
}

private List<BarEntry> generateBarEntries() {
    List<BarEntry> entries = new ArrayList<>();
    for (int i = 0; i < timeValues.size(); i++) {
        float x = timeValues.get(i);
        float y = areaValues.get(i);
        entries.add(new BarEntry(x, y));
    }
    return entries;
}

timeValues是一个包含以秒为单位的值的ArrayList,例如[3, 9, 21, 26, 33],而areaValues也是一个ArrayList,其大小与timeValues相同,每个值目前都是30(即[30, 30, 30, 30, 30])。


请贴出您目前尝试的代码。 - slasky
@petryuno1 请查看已编辑的帖子。 - Tommy Jackson
2个回答

4

好的,我已经想到了如何解决这个问题。我不会创建一个条形图,而是创建一个带有水平线和填充每条线下面区域的折线图。

LineChart timeChart = (LineChart) findViewById(R.id.timeChart);
List<ILineDataSet> dataSets = generateLineData();
LineData data = new LineData(dataSets);
timeChart.setData(data);
timeChart.invalidate();

private List<ILineDataSet> generateLineData() {
    List<ILineDataSet> dataSets = new ArrayList<>();
    for (int i = 0; i < areaValues.size(); i++) {
        List<Entry> barPoints = new ArrayList<>();
        Entry barPoint1;
        Entry barPoint2;
        LineDataSet dataSet;
        if (areaValues.get(i) >= 0) {
            barPoint1 = new Entry(timeValues.get(i), areaValues.get(i));
            barPoint2 = new Entry(timeValues.get(i+1), areaValues.get(i));
            barPoints.add(barPoint1);
            barPoints.add(barPoint2);
            dataSet = new LineDataSet(barPoints, "");
            dataSet.setColor(getResources().getColor(R.color.green));
            dataSet.setFillDrawable(ContextCompat.getDrawable(this, R.color.green));
        }
        dataSet.setDrawCircles(false);
        dataSet.setDrawFilled(true);
        dataSet.setDrawValues(false);
        dataSets.add(dataSet);
    }
    return dataSets;
}

非常出色。


请问您能否提供一下 areaValuestimeValues 的示例? - Rahul Sharma
@RahulSharma areaValues 只是为了我的目的随机生成的数字。timeValues 只需要每次递增,而且 timeValues 应该始终比 areaValues 多一个条目。一个示例条目可能是:timeValues = [0, 12, 15, 19, 33] areaValues = [20, 9, 12, 16] - Tommy Jackson

0

Sample, what i did

这并不是一件容易的事情。您需要深入研究MPAndroidChart中的barchart源代码,并找到名为BarBuffer的类。那里有一个叫做addBar()的方法。在那里,您可以更改条形图的宽度。在我的例子中,我仍然有24个单独的条形图,但如果您更改宽度,您可以使其看起来像大块。

protected void addBar(float left, float top, float right, float bottom) {

    buffer[index++] = left;
    buffer[index++] = top;
    buffer[index++] = right;
    buffer[index++] = bottom;
}

我正在寻找这个,你有例子吗?我不知道如何使用你的解决方案。祝一切顺利。 - AndroidRuntimeException

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接