我想要一个以非线性速率从开始颜色进展到结束颜色的渐变。梯度仅沿单个笛卡尔轴变化。 RadialGradient或SweepGradient不是我在这里提到的。
我的问题是,Android是否支持控制渐变转换率,而无需编写自定义着色器?
答案 0 :(得分: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/
答案 1 :(得分:0)
不是一种好方法,而是一种简单的方法:
您可以在渐变XML文件中添加centerColor
并设置所需的值。这使其成为非线性的(您需要进行一些计算)。
例如,如果您需要从透明到黑色的非线性渐变,则可以这样做:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:startColor="#00000000"
android:centerColor="#11000000"
android:endColor="#000000"
android:angle="270" />
</shape>