Рисование цвета фона между линиями ограничения - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь рисовать цвета между лимитными линиями в LineChart, расширяя класс LineChart и переопределяя метод onDraw. Я делаю это, как показано в https://github.com/PhilJay/MPAndroidChart/issues/485, где цветные прямоугольники просто рисуются на холсте:

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);
}
}

С помощью приведенного выше кода я могу нарисовать цветные прямоугольники в качестве фона за данными налинейный график, как показано здесь

chart 1

Однако, когда я прокручиваю по оси Y, прямоугольники будут «перетекать» в область, где нарисованы метки оси X, как показано в этомimage

chart2

Как мне нарисовать цветной фон, чтобы он не окрашивал область, где нарисованы метки оси X, подобно тому, как обрезаются данные линии и предельные линиичуть выше оси X?

1 Ответ

0 голосов
/ 08 октября 2019

Кажется, я нашел решение своей проблемы. Внутри метода 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);
}

Результат:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...