1

我正在开发一个使用GradientDrawable创建渐变的项目。用户选择两种颜色,应用程序会使用它们创建渐变。我还需要允许用户调整渐变级别。我使用setLevel()函数来调整它,当我有两种颜色时它工作得很好。

问题是当您使用具有 3 种(或更多)颜色的颜色数组创建GradientDrawable时。然后,当您使用“ setLevel() ”时,实际上只是在图像上向上或向下移动中间颜色。

我打算做的是允许用户调整中间颜色的量。例如,如果用户选择黑白,并选择很少的白色,则图像中间会有一条白线,两侧(顶部和底部)都有渐变为黑色。随着用户调整渐变级别,白线会散开得更多,但会非常缓慢,而不仅仅是在中间形成一条更大的亮白线。

我开始认为使用GradientDrawable不是可行的方法。我认为正确的解决方案与创建某种叠加层或分层可绘制对象并向外调整中间颜色有关……有什么想法可以让我指出正确的方向吗?

这是我目前用来创建GradientDrawable的(不起作用):

new GradientDrawable(myOrientation, arrayOfColorsInt);

看起来我不能发布任何图片(这将非常有帮助),因为我没有声誉......如果有任何方法我可以将图片发送给任何人作为示例,我可以做到这一点。

根据我接受的答案,这是我最终使用的:

public static Drawable getLinearGradient(final int color1, final int color2, final int height) { ShapeDrawable.ShaderFactory sf = new ShapeDrawable.ShaderFactory() { @Override public Shader resize(int width, int height) { LinearGradient lg = new LinearGradient(0 , 0, 0, height, new int[] { color1, color1, color2, color1, color1}, //用正确的颜色替换这些新的 float[] { 0, .25f, 0.50f, .75f, 1 },着色器.TileMode.REPEAT); 返回 lg; } }; PaintDrawable p = new PaintDrawable(); p.setShape(new RectShape()); p.setShaderFactory(sf); 返回(可绘制)p;

4

1 回答 1

0

这是一种方法。我有一段时间没有这样做了,这是凭记忆做的,所以你可能需要尝试一下。要绘制 Drawable,请使用使用 LinearGradient 作为其着色器(而不是纯色)的 Paint 对象。给 LinearGradient 一个包含五种 int 颜色的数组。

{top color, top color, center color, bottom color, bottom color}

LinearGradient 还有一个浮点数组,用于渐变中颜色的标准化位置,因此您可以控制第二个和第四个元素的位置以获得您想要的效果。

由于浮点数组是一个对象,您可以只保留对该数组的引用并修改它的 [1] 和 [4] 元素,并在用户更改级别时使您的视图无效。

您的 Drawable 不需要是 GradientDrawable 即可使用此 Paint 对象。

于 2013-08-20T17:24:18.447 回答