Я хотів би отримати градієнт, який проходить від aпочати колір до кінцевого кольору за нелінійною швидкістю. Градієнт змінюється лише вздовж однієї декадентської осі. RadialGradient або SweepGradient це не те, про що я маю на увазі тут.
Моє питання полягає в тому, чи забезпечує Android підтримку керування швидкістю переходу градієнта без написання власного шейдера?
Відповіді:
1 для відповіді № 1Так, до певної міри. LinearGradient має конструктор, що займає декілька кольорів та позицій, тому ви можете наближати нелінійну прогресію за допомогою штучної лінійної функції.
Нижче наведено код на основі відповіді 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);
Ви можете додати стільки зупинок, скільки потрібно, щоб градієнт виглядав гладким. Я також вважаю цю посилання корисною для вибору коефіцієнтів для плавного градієнта https://css-tricks.com/easing-linear-gradients/