Android SweepGradient

У меня есть SweepGradient, определяемый как

circle_paint.setShader(new SweepGradient(getWidth()/2, getHeight()/2, new int[] { circle_start_color, circle_end_color}, new float[] { 0f, 1f}))

применяется к арке, определенной как

canvas.drawArc(circle_bounds, circle_start_perc*360f, circle_end_perc*360f, true, circle_paint);

Это хорошо работает, но мне нужна свода, чтобы начать рисовать с верхней части экрана, т.е.

canvas.drawArc(circle_bounds, ((circle_start_perc*360f)-90f)%360, circle_end_perc*360f, true, circle_paint);

Проблема в том, что SweepGradient, похоже, все еще начинается с 0 градусов, и мне нужно, чтобы он начинался с 270 градусов (аналогично переводу, сделанному на рисунке дуги). Другими словами, если у меня есть градиент от белого до синего, мне нужно, чтобы верхняя часть дуги была окрашена в белый цвет, а последняя часть дуги окрашена в синий цвет. Как я могу это сделать?

Ответ 1

Вы можете попробовать использовать getLocalMatrix() и setLocalMatrix() на SweepGradient, чтобы применить поворот к шейдеру. Вы можете получить текущую матрицу, поместите соответствующее вращение с помощью postRotate(), а затем установите ее обратно в элемент шейдера.

Другим вариантом является поворот Canvas. Вы можете предварительно повернуть холст, нарисовать содержимое, а затем восстановить его; или сначала нарисуйте контент, а затем поверните холст после факта.

Ответ 2

Вращение начала SweepGradient с помощью Matrix.preRotate:

final int[] colors = {circle_start_color, circle_end_color};
final float[] positions = {0f, 1f};
Gradient gradient = new SweepGradient(circle_bounds.centerX(), circle_bounds.centerY(), colors, positions);
float rotate = 270f;
Matrix gradientMatrix = new Matrix();        
gradientMatrix.preRotate(rotate, circle_bounds.centerX(), circle_bounds.centerY());
gradient.setLocalMatrix(gradientMatrix);
mPaint.setShader(gradient);