Android是否支持渐变中的非线性进展?

时间:2015-04-27 23:17:52

标签: android gradient

我想要一个以非线性速率从开始颜色进展到结束颜色的渐变。梯度仅沿单个笛卡尔轴变化。 RadialGradient或SweepGradient不是我在这里提到的。

我的问题是,Android是否支持控制渐变转换率,而无需编写自定义着色器?

2 个答案:

答案 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>