我正在开发一个使用 GradientDrawable 创建渐变的项目。用户选择两种颜色,应用程序使用它们创建渐变。我还需要允许用户调整渐变的级别。我使用 setLevel()函数来调整它,当我有两种颜色时,它工作得很好。
问题是当您使用具有3种(或更多)颜色的颜色数组创建 GradientDrawable 时。然后当你使用' setLevel()时,你实际上只是在图像上向上或向下移动中间颜色。
我打算做的是允许用户调整中间颜色的数量。例如,如果用户选择了黑色和白色,并选择了非常少的白色,则图像中间会有一条白线,在两侧(顶部和底部)有一个黑色渐变。当用户调整渐变水平时,白线会扩散得更多,但非常缓慢,不仅仅是在中间产生更大的亮白线。
我开始认为使用带有3种颜色的 GradientDrawable 是不可取的。我的图像正确的解决方案与创建一些覆盖或分层drawable和调整中间颜色向外...任何想法让我指向正确的方向?
以下是我目前使用的(不起作用)来创建 GradientDrawable :
new GradientDrawable(myOrientation, arrayOfColorsInt);
看起来我不能发布任何图片(这会非常有帮助),因为我没有声誉....如果有任何方式我可以发送图片给任何人作为一个例子,我可以做到这一点。
这是我最终使用的结果,基于我接受的答案:
public static Drawable getLinearGradient(final int color1,final int color2,final int height){ ShapeDrawable.ShaderFactory sf = new ShapeDrawable.ShaderFactory(){ @覆盖 public Shader resize(int width,int height){ LinearGradient lg = new LinearGradient(0,0,0,height, new int [] { COLOR1, COLOR1, COLOR2, COLOR1, color1},//替换正确的颜色 new float [] { 0,.25f,0.50f,.75f,1}, Shader.TileMode.REPEAT); 返回lg; } }; PaintDrawable p = new PaintDrawable(); p.setShape(new RectShape()); p.setShaderFactory(SF); return(Drawable)p;
答案 0 :(得分:0)
这是一种方法。我有一段时间没有这样做,这是来自内存,所以你可能需要进行一些实验。要绘制Drawable,请使用使用LinearGradient作为其着色器(而不是纯色)的Paint对象。为LinearGradient提供五种int颜色的数组。
{top color, top color, center color, bottom color, bottom color}
LinearGradient还有一个浮点数组,用于渐变中颜色的标准化位置,因此您可以控制第二个和第四个元素的位置以获得所需的效果。
由于float数组是一个对象,你可以保持对这个数组的引用并修改它的[1]和[4]元素,并在用户更改关卡时使视图无效。
您的Drawable不需要是GradientDrawable就可以使用此Paint对象。