Sì, in una certa misura. LinearGradient ha un costruttore che accetta più colori e posizioni, quindi puoi approssimare la progressione non lineare usando la funzione lineare a tratti.
Il codice qui sotto si basa sulla risposta https://stackoverflow.com/a/4381192/8568479
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);
È possibile aggiungere il numero di fermate di cui hai bisogno per rendere il gradiente aspetto liscio. Ho anche trovato utile questo collegamento per selezionare i coefficienti per un gradiente dall'aspetto lineare https://css-tricks.com/easing-linear-gradients/