从指定位置偏移绘制线性渐变

Lineargradient is drawn offset from specified positon

我用这段代码用 Lineargradient 制作了一个色调渐变:(我知道它可以用 Color.parseColor 变得更简单,但它必须是我打算做的事情。我不能使用也可以绘制。)

colors = new int[]{ Color.HSVToColor(new float[]{0, 1, 1}),
                    Color.HSVToColor(new float[]{60, 1, 1}), 
                    Color.HSVToColor(new float[]{120, 1, 1}), 
                    Color.HSVToColor(new float[]{180, 1, 1}),
                    Color.HSVToColor(new float[]{240, 1, 1}), 
                    Color.HSVToColor(new float[]{300, 1, 1}), 
                    Color.HSVToColor(new float[]{360, 1, 1}) };
Shader shader = new LinearGradient(0, 0, width, 0, colors, null, Shader.TileMode.CLAMP);
paint.setShader(shader);

生成的结果颜色略有偏移,与预期结果相比,绿色区域太小,蓝色区域太大。

我检查了一切。我尝试使用 new float[]{0f, 1/6f, 2/6f, 3/6f, 4/6f, 5/6f, 1f} 而不是 null 作为位置参数,结果相同。这也可能是一个错误。

请注意,这不是 this post nor this one. These are about incorrect gradient stops set in code which is not my case. It might be related to 的副本,但我不知道如何。

编辑:也许这可以通过为颜色设置不相等的位置来解决,但是我如何计算这些确切的位置?

我总共花了 3 个多小时来解决这个问题,好吧……结果几乎什么都没有。它在我的代码中。最糟糕的是我添加了赏金并在 15 分钟后解决了它。

我在一个视图中用特定的填充画了渐变,而不是这个

LinearGradient(0, 0, width, 0, colors, null, Shader.TileMode.CLAMP);

我不得不这样做:

LinearGradient(left, 0, right, 0, colors, null, Shader.TileMode.CLAMP);

渐变以某种方式在我添加到我的视图的填充之前开始,位于 (0, 0),这是我的渐变开始向左倾斜 10 度,导致偏移。

现在一切都明白了。