【发布时间】:2015-04-27 23:17:52
【问题描述】:
我想要一个以非线性速率从起始颜色渐变到结束颜色的渐变。梯度只会沿单个笛卡尔轴变化。 RadialGradient 或 SweepGradient 不是我在这里指的。
我的问题是,Android 是否支持控制渐变过渡率,而无需编写自定义着色器?
【问题讨论】:
我想要一个以非线性速率从起始颜色渐变到结束颜色的渐变。梯度只会沿单个笛卡尔轴变化。 RadialGradient 或 SweepGradient 不是我在这里指的。
我的问题是,Android 是否支持控制渐变过渡率,而无需编写自定义着色器?
【问题讨论】:
是的,在一定程度上。 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/
【讨论】:
不是一个好方法,而是一个简单的方法:
您可以在渐变 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>
【讨论】: