按照此答案,我使用AndroidMPChart库填充了两条线之间的空间。
但是现在我想要自定义填充颜色,使其具有以下特点:
边界之上的区域填充蓝色;
边界之下的区域填充绿色。
如下截图所示(请注意,蓝色线是线集,因此可能不是限制线):
我想自定义图表的线条颜色,将其设置为填充颜色:
对于边界之上的线条,请使用蓝色;
对于边界之下的线条,请使用绿色。
这样做是否可行? 我在使用MPAndroidChart时找不到类似的东西。
谢谢!
按照此答案,我使用AndroidMPChart库填充了两条线之间的空间。
但是现在我想要自定义填充颜色,使其具有以下特点:
边界之上的区域填充蓝色;
边界之下的区域填充绿色。
如下截图所示(请注意,蓝色线是线集,因此可能不是限制线):
我想自定义图表的线条颜色,将其设置为填充颜色:
对于边界之上的线条,请使用蓝色;
对于边界之下的线条,请使用绿色。
这样做是否可行? 我在使用MPAndroidChart时找不到类似的东西。
谢谢!
我已经使用自定义图表渲染完成了这个(指某项任务)。我在这里使用了线条的颜色,但你也可以使用其他颜色。在这里更改你的颜色: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()
}
}
你可以尝试在LineChartRender中重写drawLinear方法
这对我来说行得通:
dataSet.setFillFormatter(new DefaultFillFormatter() {
@Override
public float getFillLinePosition(ILineDataSet dataSet, LineDataProvider dataProvider) {
return 22500;// its value of midel Y line
}
});