Поддерживает ли Android нелинейное прогрессирование в градиентах?

Я хотел бы, чтобы градиент прогрессировал от начального цвета до конечного цвета с нелинейной скоростью. Градиент изменился бы только вдоль одной декартовой оси. RadialGradient или SweepGradient не то, что я имею в виду здесь.

Мой вопрос в том, поддерживает ли Android поддержку скорости перехода градиента без написания пользовательского Shader?

Ответ 1

Да, в определенной степени. LinearGradient имеет конструктор, который принимает несколько цветов и положений, поэтому вы можете приблизить нелинейную прогрессию, используя кусочно-линейную функцию.

Код ниже основан на ответе fooobar.com/info/18623/...

ShapeDrawable.ShaderFactory shaderFactory = new ShapeDrawable.ShaderFactory() {
    @Override
    public Shader resize(int width, int height) {
        LinearGradient gradient = new LinearGradient(0, 0, width, height,
            new int[] { 
                Color.parseColor("#000000"),
                Color.parseColor("#777777"),
                Color.parseColor("#FFFFFF")
            },
            new float[] { 0, 0.3f, 1 },
            Shader.TileMode.REPEAT
        );
        return gradient;
    }
};

PaintDrawable p = new PaintDrawable();
p.setShape(new RectShape());
p.setShaderFactory(shaderFactory);

Вы можете добавить столько остановок, сколько нужно, чтобы градиент выглядел гладким. Я также нашел эту ссылку полезной для выбора коэффициентов для гладкого градиента https://css-tricks.com/easing-linear-gradients/