gpt4 book ai didi

Android - 如何绘制基于弧的渐变

转载 作者:IT老高 更新时间:2023-10-28 22:21:04 33 4
gpt4 key购买 nike

我正在尝试创建一个从一种颜色逐渐变为另一种颜色的弧(可变度数)。从蓝色到红色的例子:

enter image description here

这是我的代码:

SweepGradient shader = new SweepGradient(center.x, center.y, resources.getColor(R.color.startColor),resources.getColor(R.color.endColor));
Paint paint = new Paint()
paint.setStrokeWidth(1);
paint.setStrokeCap(Paint.Cap.FILL);
paint.setStyle(Paint.Style.FILL);
paint.setShader(shader);
canvas.drawArc(rectF, startAngle, sweepAngle, true, paint);

但结果是整个弧线都涂上了相同的颜色。

编辑:
经过更多的实验,我发现颜色扩散是由圆弧的角度决定的。如果我画一个小角度的圆弧,只显示第一种颜色。角度越大,绘制的颜色就越多。如果角度很小,似乎没有渐变。
这里是一个例子。我正在绘制 4 条弧线 - 90、180、270 和 360:

RectF rect1 = new RectF(50, 50, 150, 150);
Paint paint1 = new Paint();
paint1.setStrokeWidth(1);
paint1.setStrokeCap(Paint.Cap.SQUARE);
paint1.setStyle(Paint.Style.FILL);

SweepGradient gradient1 = new SweepGradient(100, 100,
Color.RED, Color.BLUE);
paint1.setShader(gradient1);

canvas.drawArc(rect1, 0, 90, true, paint1);

RectF rect2 = new RectF(200, 50, 300, 150);
Paint paint2 = new Paint();
paint2.setStrokeWidth(1);
paint2.setStrokeCap(Paint.Cap.SQUARE);
paint2.setStyle(Paint.Style.FILL);

SweepGradient gradient2 = new SweepGradient(250, 100,
Color.RED, Color.BLUE);
paint2.setShader(gradient2);

canvas.drawArc(rect2, 0, 180, true, paint2);

RectF rect3 = new RectF(50, 200, 150, 300);
Paint paint3 = new Paint();
paint3.setStrokeWidth(1);
paint3.setStrokeCap(Paint.Cap.SQUARE);
paint3.setStyle(Paint.Style.FILL);

SweepGradient gradient3 = new SweepGradient(100, 250,
Color.RED, Color.BLUE);
paint3.setShader(gradient3);

canvas.drawArc(rect3, 0, 270, true, paint3);

RectF rect4 = new RectF(200, 200, 300, 300);
Paint paint4 = new Paint();
paint4.setStrokeWidth(1);
paint4.setStrokeCap(Paint.Cap.SQUARE);
paint4.setStyle(Paint.Style.FILL);

SweepGradient gradient4 = new SweepGradient(250, 250,
Color.RED, Color.BLUE);
paint4.setShader(gradient4);

canvas.drawArc(rect4, 0, 360, true, paint4);

结果如下:

enter image description here

这令人惊讶,因为我希望红色位于弧线的起点,蓝色位于弧线的末端,无论角度如何,两者之间的任何东西都会均匀分布。
我尝试使用位置参数手动分隔颜色,但结果相同:

int[] colors = {Color.RED, Color.BLUE};
float[] positions = {0,1};
SweepGradient gradient = new SweepGradient(100, 100, colors , positions);

知道如何解决这个问题吗?

最佳答案

解决办法是设置BLUE的位置。这样做是这样的:

int[] colors = {Color.RED, Color.BLUE};
float[] positions = {0,1};
SweepGradient gradient = new SweepGradient(100, 100, colors , positions);

这里的问题是,当设置 BLUE 的位置为 '1' 时,这并不意味着它将定位在绘制的圆弧的末端,而是位于圆弧所在的圆的末端.为了解决这个问题,BLUE 位置应该考虑弧度数。因此,如果我正在绘制 X 度的圆弧,则位置将设置如下:

float[] positions = {0,Xf/360f};

所以如果 X 为 90,渐变将 BLUE 放置在圆的 0.25 处:

enter image description here

关于Android - 如何绘制基于弧的渐变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9037108/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com