在限制线之间绘制背景颜色

Drawing background color between limit lines

我试图通过扩展 LineChart class 并覆盖 onDraw 方法在 LineChart 中的限制线之间绘制颜色。我正在按照 https://github.com/PhilJay/MPAndroidChart/issues/485 中的方式进行操作,其中彩色矩形只是简单地绘制在 canvas:

public class CustomLineChart extends LineChart {

protected Paint mYAxisZonePaint;
protected  String[] arrayColors = {"#FFFFFF","#F4D03F","#F5B041","#EB984E","#DC7633"};

    @Override
protected void init() {
    super.init();
    mYAxisZonePaint = new Paint();
    mYAxisZonePaint.setStyle(Paint.Style.FILL);
}

@Override
protected void onDraw(Canvas canvas) {
    List<LimitLine> limitLines = mAxisLeft.getLimitLines();

    if (limitLines == null || limitLines.size() < 4){
        super.onDraw(canvas);
        return;
    }

    float[] pts = new float[2];

    float startPts = 0;

    for (int i = 0; i < limitLines.size(); i++) {
        pts[0] = limitLines.get(i).getLimit();
        pts[1] = startPts;

        mLeftAxisTransformer.pointValuesToPixel(pts);
        mYAxisZonePaint.setColor(Color.parseColor(arrayColors[i]));

        canvas.drawRect(mViewPortHandler.contentLeft(), pts[1], mViewPortHandler.contentRight(), pts[0], mYAxisZonePaint);

        startPts = limitLines.get(i).getLimit();

    }
    super.onDraw(canvas);
}
}

使用上面的代码,我可以在折线图上的数据后面绘制彩色矩形作为背景,如此处所示

然而,当我在 Y 轴上滚动时,矩形将 "overflow" 进入绘制 X 轴标签的区域,如此图所示

我应该如何绘制彩色背景,使其不会为绘制 X 轴标签的区域着色,类似于如何在 X 轴上方切断线数据和限制线?

看来我找到了解决问题的方法。在 onDraw 方法中,我应该限制以下绘制操作可以写入的区域。我将以下内容添加到我的 onDraw 方法中:

@Override
protected void onDraw(Canvas canvas) {
    List<LimitLine> limitLines = mAxisLeft.getLimitLines();

    // Saves current canvas
    int clipRestoreCount = canvas.save();
    // Makes sure that the colored background cannot be drawn outside the content-rect. Otherwise the colored background would be drawn above and beneath the graph "borders".
    canvas.clipRect(mViewPortHandler.getContentRect());

    if (limitLines == null || limitLines.size() < 4){
        super.onDraw(canvas);
        return;
    }

    float[] pts = new float[2];

    float startPts = 0;

    for (int i = 0; i < limitLines.size(); i++) {
        pts[0] = limitLines.get(i).getLimit();
        pts[1] = startPts;

        mLeftAxisTransformer.pointValuesToPixel(pts);
        mYAxisZonePaint.setColor(Color.parseColor(arrayColors[i]));

        canvas.drawRect(mViewPortHandler.contentLeft(), pts[1], mViewPortHandler.contentRight(), pts[0], mYAxisZonePaint);

        startPts = limitLines.get(i).getLimit();

    }

    // Removes the clipping rectangles so rest of graph elements can be drawn (like x-axis/y-axis labels)
    canvas.restoreToCount(clipRestoreCount);
    super.onDraw(canvas);
}

Result: