Android - настройка нескольких цветов для сложных путей на холсте - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь создать путь на графике XY. Я хотел бы закрасить путь, где цвет будет указывать вес пользователя.

Я попробовал этот код:

private final float[] PERCENT_COLORS = {0.0f, 0.2f, 0.4f, 0.6f, 0.8f, 1f, 1.2f};
public float[] normalizedPercentColors = {0.0f, 0.2f, 0.4f, 0.6f, 0.8f, 1f, 1.2f};
private final int[] COLOR_SCALE = {
    Color.rgb(210, 210, 210),
    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)};

@Override
public void onGenerateColors(TreadmillApp.TmData data) {
    reportColors.add(generateColor((data.totalForce * .1f / (float) mApp.weightValue)));
}

public int generateColor(float percent) {
    if (percent >= 1.20) {
        return Color.rgb( 0, 0, 0);
    } else if (percent < normalizedPercentColors[0]) {
        return Color.rgb(100, 100, 100);
    }

    int i = 1;
    for (; i < normalizedPercentColors.length - 1; i++) {
        if (percent < normalizedPercentColors[i]) {
            break;
        }
    }

    float lower = normalizedPercentColors[i - 1];
    float upper = normalizedPercentColors[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);
}

public void setColors(ArrayList<Integer> reportColors) {
    int[] colors = Ints.toArray(reportColors);
    Shader shader = new LinearGradient(0, 0, 0, mPointArray.size(), colors,
            null, Shader.TileMode.REPEAT);
    Matrix matrix = new Matrix();
    matrix.setRotate(90);
    shader.setLocalMatrix(matrix);
    pathPaint.setShader(shader); //paint to set path
}

Где я установил свой путь на pathPaint, основываясь на примере, который я нашел в другом вопросе. Однако setColors, похоже, не работает со сложными путями. Мне было интересно, есть ли способ установить несколько цветов для моего пути без необходимости создавать новый путь каждый раз, когда я устанавливаю цвет для своего пути?

...