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

Pha*_*inh 2 android canvas sweepgradient

我想创建一个带有渐变的CircleView - > left - > top - > right.
所以我用帆布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);
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是这个的默认顺序是正确的 - >底部 - >左边 - >顶部但是我想底部 - >左边 - >顶部 - >右边 我试过改变位置到

float[] positions = {0.25f, 1.25f};
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能像这样制作SweepGradient渐变bottom -> left -> top -> right

在此输入图像描述

--- UPDATE --- 我们可以使用setLocalMatrixSweepGradient这样的旋转渐变

Matrix matrix = new Matrix();
matrix.setRotate(90, 100, 100);
gradient.setLocalMatrix(matrix);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

bli*_*ard 5

在绘制圆之前旋转画布.

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑-1:@ pkskink
建议的替代方法是使用如下: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);
}
Run Code Online (Sandbox Code Playgroud)