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);