Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何用渐变填充ShapeDrawable(包含PathShape)_Android_Drawable - Fatal编程技术网

Android 如何用渐变填充ShapeDrawable(包含PathShape)

Android 如何用渐变填充ShapeDrawable(包含PathShape),android,drawable,Android,Drawable,我在使用drawable的setShaderFactory方法填充包含自定义PathShape的ShapeDrawable时遇到问题。绘制矩形形状时,以下代码非常有效: 但是,当我将RectShape更改为任何自定义PathShape时,drawable仅使用渐变开始颜色红色填充整个形状。换句话说,自定义形状绘制正确,但颜色完全错误。以前有人看到过这一点,知道问题出在哪里吗?经过实验,我发现渐变的大小必须与PathShape创建时的标准宽度和标准高度相关,而与ShapedRavable的高度和宽

我在使用drawable的setShaderFactory方法填充包含自定义PathShape的ShapeDrawable时遇到问题。绘制矩形形状时,以下代码非常有效:


但是,当我将RectShape更改为任何自定义PathShape时,drawable仅使用渐变开始颜色红色填充整个形状。换句话说,自定义形状绘制正确,但颜色完全错误。以前有人看到过这一点,知道问题出在哪里吗?

经过实验,我发现渐变的大小必须与PathShape创建时的标准宽度和标准高度相关,而与ShapedRavable的高度和宽度无关。这意味着您必须在ShapedRavable的整个生命周期内跟踪指定给PathShape的标准宽度/高度,以防其调整大小

虽然有点不雅观,但这里有一个解决方案:

public static final int STD_WIDTH = 20;
public static final int STD_HEIGHT = 20;

PathShape shape = new PathShape(myPath, STD_WIDTH,
        STD_HEIGHT);
ShapeDrawable drawable = new ShapeDrawable();
drawable.setShape(myPathShape);
drawable.setShaderFactory(new ShaderFactory() {
    @Override
    public Shader resize(int width, int height) {
        LinearGradient gradient = new LinearGradient (0, 0,
                STD_WIDTH, STD_HEIGHT, Color.Red, Color.Blue,
                TileMode.REPEAT);
        return gradient;
    }
});
public static final int STD_WIDTH = 20;
public static final int STD_HEIGHT = 20;

PathShape shape = new PathShape(myPath, STD_WIDTH,
        STD_HEIGHT);
ShapeDrawable drawable = new ShapeDrawable();
drawable.setShape(myPathShape);
drawable.setShaderFactory(new ShaderFactory() {
    @Override
    public Shader resize(int width, int height) {
        LinearGradient gradient = new LinearGradient (0, 0,
                STD_WIDTH, STD_HEIGHT, Color.Red, Color.Blue,
                TileMode.REPEAT);
        return gradient;
    }
});