Ответ 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/