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

MM.*_*MM. 12 android gradient

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

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

fde*_*hin 1

是的,在某种程度上。LinearGradient 有一个采用多种颜色和位置的构造函数,因此您可以使用分段线性函数来近似非线性渐变。

下面的代码基于答案/sf/answers/306683471/

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);
Run Code Online (Sandbox Code Playgroud)

您可以根据需要添加任意多个停止点以使渐变看起来平滑。我还发现此链接有助于选择平滑渐变的系数https://css-tricks.com/easing-linear-gradients/