Android - 使用MPAndroidChart在两条线之间填充不同颜色

3

按照此答案,我使用AndroidMPChart库填充了两条线之间的空间。

但是现在我想要自定义填充颜色,使其具有以下特点:

  • 边界之上的区域填充蓝色;

  • 边界之下的区域填充绿色。

如下截图所示(请注意,蓝色线是线集,因此可能不是限制线):

enter image description here

我想自定义图表的线条颜色,将其设置为填充颜色:

  • 对于边界之上的线条,请使用蓝色;

  • 对于边界之下的线条,请使用绿色。

这样做是否可行? 我在使用MPAndroidChart时找不到类似的东西。

谢谢!


我认为您可以用不同的颜色画出两条线。第一条线(添加大于20的值)设置为蓝色,第二条线(添加小于20的值)设置为绿色。 - Yamini
你能给我一个例子吗?我不太清楚如何构建具有 LineDataSets 的两行。 - Manuela
@Manuela,你有解决方案吗?你能告诉我怎么做吗? - Narender Reddy
3个回答

0

我已经使用自定义图表渲染完成了这个(指某项任务)。我在这里使用了线条的颜色,但你也可以使用其他颜色。在这里更改你的颜色:drawFilledPath(c, filled, dataSet.colors[index], dataSet.fillAlpha)

class CustomLineChartRender(
lineDataProvider: LineDataProvider,
chartAnimator: ChartAnimator,
port: ViewPortHandler

):LineChartRenderer(lineDataProvider, chartAnimator, port) { override fun drawLinearFill( c: Canvas?, dataSet: ILineDataSet?, trans: Transformer?, bounds: XBounds? ) { val filled = mGenerateFilledPathBuffer

    val startingIndex = bounds!!.min
    val endingIndex = bounds!!.range + bounds!!.min
    val indexInterval = 1

    var currentStartIndex = 0
    var currentEndIndex = indexInterval
    var iterations = 0

    do {
        currentStartIndex = startingIndex + iterations * indexInterval
        currentEndIndex = currentStartIndex + indexInterval
        currentEndIndex = if (currentEndIndex > endingIndex) endingIndex else currentEndIndex
        if (currentStartIndex <= currentEndIndex) {
            generateFilledPath(dataSet!!, currentStartIndex, currentEndIndex, filled)
            trans!!.pathValueToPixel(filled)
            val drawable = dataSet.fillDrawable
            if (drawable != null) {
                drawFilledPath(c, filled, drawable)
            } else {
                val index = startingIndex + iterations
                drawFilledPath(c, filled, dataSet.colors[index], dataSet.fillAlpha)
            }
        }
        iterations++
    } while (currentStartIndex <= currentEndIndex)

}

private fun generateFilledPath(
    dataSet: ILineDataSet,
    startIndex: Int,
    endIndex: Int,
    outputPath: Path
) {
    val fillMin = dataSet.fillFormatter.getFillLinePosition(dataSet, mChart)
    val phaseY = mAnimator.phaseY
    val isDrawSteppedEnabled = dataSet.mode == LineDataSet.Mode.STEPPED
    outputPath.reset()
    val entry = dataSet.getEntryForIndex(startIndex)
    outputPath.moveTo(entry.x, fillMin)
    outputPath.lineTo(entry.x, entry.y * phaseY)

    // create a new path
    var currentEntry: Entry? = null
    var previousEntry = entry
    for (x in startIndex + 1..endIndex) {
        currentEntry = dataSet.getEntryForIndex(x)
        if (isDrawSteppedEnabled) {
            outputPath.lineTo(currentEntry.x, previousEntry!!.y * phaseY)
        }
        outputPath.lineTo(currentEntry.x, currentEntry.y * phaseY)
        previousEntry = currentEntry
    }

    // close up
    if (currentEntry != null) {
        outputPath.lineTo(currentEntry.x, fillMin)
    }
    outputPath.close()
}

}


0

你可以尝试在LineChartRender中重写drawLinear方法


0

这对我来说行得通:

dataSet.setFillFormatter(new DefaultFillFormatter() {
    @Override
    public float getFillLinePosition(ILineDataSet dataSet, LineDataProvider dataProvider) {
        return 22500;// its value of midel Y line 
    }
});

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