Android Canvas - Как изменить цвет контура без изменения цвета ранее нарисованных контуров? Мне нужно отображать данные в реальном времени - PullRequest
0 голосов
/ 18 января 2019

Хотелось бы узнать, есть ли в Android способ изменить цвет контура на холсте в SurfaceView без изменения цвета ранее прорисованных контуров? Я знаю, что этот вопрос задавался ранее, но данное решение не будет работать для меня, потому что я рисую путь, отображающий живые данные, и необходимость создавать новый объект Path каждый раз, когда мне нужно изменить цвет, не будет наилучшим производительности.

По сути, я рисую график в реальном времени, который отображает вес человека, и я хотел бы, чтобы мой путь постепенно менял цвет в зависимости от веса, переходя от серого, затем желтого, затем зеленого, затем синего, затем фиолетового, затем красного, затем черный. Создание новых объектов Path каждый раз, когда мне нужно изменить цвет, не будет работать в моем сценарии, так как я буду проходить через много разных цветов при отображении живых данных. По сути, я не хочу, чтобы весь путь менялся, но меняются определенные точки на пути.

Кто-нибудь знает альтернативные решения?

РЕДАКТИРОВАТЬ: Вот мой код для генерации цвета:

 private final float[] PERCENT_COLORS = {0f, 0.2f, 0.4f, 0.6f, 0.8f, 1f, 1.2f};
 private final int[] COLOR_SCALE = {
        Color.rgb(200, 200, 200),
        Color.rgb(255, 255, 0),
        Color.rgb(102, 204, 51),
        Color.rgb(51, 81, 220),
        Color.rgb(171, 53, 133),
        Color.rgb(210, 39, 39),
        Color.rgb(0, 0, 0)};

public int generateColor(float percent) {
    if (percent >= 1.20) {
        return Color.rgb(0, 0, 0);
    } else if (percent < PERCENT_COLORS[0]) {
        return Color.rgb(100, 100, 100);
    }
    int i = 1;
    for (; i < PERCENT_COLORS.length - 1; i++) {
        if (percent < PERCENT_COLORS[i]) {
            break;
        }
    }

    float lower = PERCENT_COLORS[i - 1];
    float upper = PERCENT_COLORS[i];
    float range = upper - lower;
    float percentUpper = (percent - lower) / range;
    float percentLower = 1 - percentUpper;

    int red = (int) Math.floor(Color.red(COLOR_SCALE[i - 1]) * percentLower + Color.red(COLOR_SCALE[i]) * percentUpper);
    int green = (int) Math.floor(Color.green(COLOR_SCALE[i - 1]) * percentLower + Color.green(COLOR_SCALE[i]) * percentUpper);
    int blue = (int) Math.floor(Color.blue(COLOR_SCALE[i - 1]) * percentLower + Color.blue(COLOR_SCALE[i]) * percentUpper);

    return Color.rgb(red, green, blue);
}

По сути, я иду через радугу цветов. Мне нужно использовать этот код на пути без изменения цвета всего пути.

...