Java 定义多色渐变

Java 定义多色渐变,java,android,gradient,Java,Android,Gradient,第一个帖子在这里。请原谅,如果这是显而易见的。我是xml和java的新手,主要是一名设计师 我想实现我在Adobe Illustrator和Photoshop中为我正在开发的应用程序创建的设计。我知道可以将XML与开始/中心/结束颜色一起用于基本渐变。但我想创建一个我设计的,有很多颜色和自定义间隔的开始和结束。我在另一个线程中发现了此解决方案: ShapeDrawable.ShaderFactory shaderFactory = new ShapeDrawable.ShaderFactory(

第一个帖子在这里。请原谅,如果这是显而易见的。我是xml和java的新手,主要是一名设计师

我想实现我在Adobe Illustrator和Photoshop中为我正在开发的应用程序创建的设计。我知道可以将XML与开始/中心/结束颜色一起用于基本渐变。但我想创建一个我设计的,有很多颜色和自定义间隔的开始和结束。我在另一个线程中发现了此解决方案:

ShapeDrawable.ShaderFactory shaderFactory = new ShapeDrawable.ShaderFactory() {
    @Override
    public Shader resize(int width, int height) {
        LinearGradient linearGradient = new LinearGradient(0, 0, width, height,
            new int[] { 
                0xFF1e5799, 
                0xFF207cca, 
                0xFF2989d8, 
                0xFF207cca }, //substitute the correct colors for these
            new float[] {
                0, 0.40f, 0.60f, 1 },
            Shader.TileMode.REPEAT);
         return linearGradient;
    }
};
PaintDrawable paint = new PaintDrawable();
paint.setShape(new RectShape());
paint.setShaderFactory(shaderFactory);
如何包括通过值/颜色手动定义的颜色?它不允许我使用@color/darkgrey等,因为它们不是整数。我也不能把它们放在六边形代码中,可能是出于同样的原因

我想做新的int[]{@color/A,@color/B,…}

还有,第二个问题:浮动似乎定义了使用颜色的自定义间隔。在他的例子中,他有4种int颜色和4个float值,但这只定义了我所理解的3个间隔(?): [0,0.4][0.4,0.6][0.6,1]的百分比。 还是以不同的方式工作

如有必要,我会详细说明

如何包括通过值/颜色手动定义的颜色

如果要在java中使用颜色资源值,则需要访问
上下文
对象或其子类之一(如
活动
)。然后你可以打电话

int color = ContextCompat.getColor(context, R.color.my_color_name);
浮动似乎定义了使用颜色的自定义间隔

不完全是。
float[]
值定义了从
0
1
的每种颜色放置点。因此,如果有四种颜色,则需要四个位置(第一个和最后一个位置应为0和1)

考虑到这一点,你可以这样写:

int[] colors = new int[] {
    ContextCompat.getColor(context, R.color.color_one),
    ContextCompat.getColor(context, R.color.color_two),
    ContextCompat.getColor(context, R.color.color_three),
    ContextCompat.getColor(context, R.color.color_four);
};

float[] positions = new float[] {
    0, 0.33, 0.67, 1
};

LinearGradient linearGradient = 
    new LinearGradient(0, 0, width, height, colors, positions, Shader.TileMode.REPEAT);
这将从以下位置产生梯度:

  • color\u one
    color\u two
    at
    0
    0.33
  • color\u two
    color\u two
    at
    0.33
    0.67
  • color\u-three
    color\u-three
    at
    0.67
    1

@本的答案很完整,回答了你的大部分问题。我还要回答最后一点

我也不能把它们放在六边形代码中,可能是出于同样的原因

在Java中,在“0x”前面加上前缀以表示十六进制表示法。颜色表示为ARGB(Alpha/R/G/B),因此

int red = 0xffff0000, blue = 0xff0000ff, green = 0xff00ff00;
int red_half_alpha = 0x80ff0000;

是正确的。

您所说的“它不允许我使用@color/darkgrey等”是什么意思?感谢您对0x的澄清,我知道如何应用它;不过,使用Ben提供的上述方法在一致性方面会更好,同时也可以避免一直查找argb,我想?是的,硬编码的东西越少越好,当然,我只是想告诉您,如果您需要的话,如何在Java中使用十六进制值:)非常感谢!一开始,我对上下文参数有点困惑,但是我用LoginActivity.this(它应用的那个)替换了它,在谷歌搜索之后,它工作了。我现在如何影响角度?这是缺少的最后一点,目前它是对角的。前四个参数(在我的示例中,
0,0,width,height
)是两点,因此我的示例渐变从
(0,0)
绘制到
(width,height)
。两点的相对位置定义了角度。