Estoy tratando de crear un arco (número variable de grados) que vaya gradualmente de un color a otro. Del ejemplo de azul a rojo:
Android - Cómo dibujar un degradado basado en arco
Este es mi código:
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);
Pero el resultado es todo el arco está pintado con el mismo color.
Editar:
Después de más experimentación, descubrí que el color propagación está determinada por el ángulo del arco. Si dibujo un arco con un pequeño ángulo, solo se muestra el primer color. Cuanto mayor es el ángulo, más colores se dibujan. Si el ángulo es pequeño, parece que no hay gradiente.
Aquí hay un ejemplo. Estoy dibujando arcos 4 - 90, 180, 270 y 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);
Y aquí está el resultado:
Esto es sorprendente porque yo esperaría que el ROJO para estar en el el comienzo del arco, el AZUL al final y el enything intermedio para repartir uniformemente sin importar el ángulo.
Me trataron de espacio de los colores de forma manual utilizando el parámetro de posiciones, pero los resultados fueron los mismos:
int[] colors = {Color.RED, Color.BLUE};
float[] positions = {0,1};
SweepGradient gradient = new SweepGradient(100, 100, colors , positions);
alguna idea de cómo resolver esto?
Al menos en Android 4.2, la solución dada no funciona.Hay una necesidad de tener un valor de 1 al final de la matriz. Algo como esto: int [] colors = {Color.RED, Color.BLUE, Color.BLUE}; flotante [] posiciones = {0, Xf/360f, 1}; –
¿Sabes por qué la resolución es tan mala si el ángulo es muy pequeño? como un ancho de arco de 10 grados significa solo 3 colores. Puede ver los pasos también en su captura de pantalla en la torta topleft –