SweepGradient 改变开始和结束颜色的位置

SweepGradient change position of start and end color

我想创建一个从 底部 -> 左侧 -> 顶部 -> 右侧渐变的 CircleView
所以我使用 canvas 和 SweepGradient 像这样

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Paint paint = new Paint();

    int[] colors = {Color.GREEN, Color.RED};
    float[] positions = {0, 1};

    SweepGradient gradient = new SweepGradient(100, 100, colors, positions);
    paint.setShader(gradient);
    canvas.drawCircle(100, 100, 100, paint);
}

但是默认顺序是 right -> bottom -> left -> top 但我想要 bottom -> left -> top -> right 我试过将位置更改为

float[] positions = {0.25f, 1.25f};

但它只适用于AndroidStudio的Preview,当我在真实设备中运行时,它显示的结果与positions = {0, 1}

相同

如何从 bottom -> left -> top -> right 像这样制作 SweepGradient 渐变

---更新--- 我们可以像这样使用 setLocalMatrix for SweepGradient 来旋转渐变

Matrix matrix = new Matrix();
matrix.setRotate(90, 100, 100);
gradient.setLocalMatrix(matrix);

在画圆之前旋转 canvas。

public class CircleView extends View {
    private Paint paint;

    public CircleView(Context context) {
        super(context);
        init();
    }

    public CircleView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CircleView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public void init() {
        paint = new Paint();

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

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.save();
        canvas.rotate(90, 100, 100);
        canvas.drawCircle(100, 100, 100, paint);
        canvas.restore();
    }
}

编辑-1:
@pkskink is to use setLocalMatrix 建议的替代方法如下:

public void init() {      
    int[] colors = {Color.GREEN, Color.RED};
    float[] positions = {0, 1};

    Matrix matrix = new Matrix();
    matrix.postRotate(90, 100, 100);

    Shader gradient = new SweepGradient(100, 100, colors, positions);
    gradient.setLocalMatrix(matrix);

    paint = new Paint();
    paint.setShader(gradient);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawCircle(100, 100, 100, paint);
}