2012-05-13 11 views
6

Necesito crear una máscara de recorte con forma de sector circular.Máscara de recorte en forma de sector circular con Path.addArc?

soy capaz de dibujar una utilizando la siguiente:

paint.setColor(0x88FF0000); 
paint.setStyle(Style.FILL); 
canvas.drawArc(oval, 0, 30, true, paint); 

Quiero utilizarlo como un trazado de recorte, así que he intentado:

Path path = new Path(); 
path.addArc(oval, 0, 30); 
canvas.clipPath(path, Op.REPLACE); 

Sin embargo addArc No tiene el parámetro useCenter así que lo que obtengo no es un sector sino un segmento.

Respuesta

12

Ok, parece que no hay una forma adecuada de hacerlo con una máscara de recorte.

Sin embargo, hay una manera alternativa de usar PorterDuffXfermode. Ver Xfermodes en ApiDemos.

Simplemente dibuje un sector usando drawArc sobre mi imagen con el operador DST_OUT. Esto hace que la parte de la imagen cubierta por el sector sea invisible (no dibujada).

paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
paint.setColor(0xFFFFFFFF); 
paint.setStyle(Style.FILL); 
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); 

canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); 
drawable.draw(canvas); 
canvas.drawArc(oval, 30, 90, true, paint); 
2

Necesitaba modificar la biblioteca AChartEngine para Android para convertir el gráfico circular en un gráfico de dona. Necesitaba reemplazar lo siguiente:

canvas.drawArc(oval, startAngle, sweepAngle, useCenter, paint); 

usando la clase Path para poder utilizar el recorte. El código siguiente hizo el trabajo para mí:

Path path = new Path(); 
path.moveTo(oval.centerX(), oval.centerY()); 
path.addArc(oval, startAngle, sweepAngle); 
path.lineTo(oval.centerX(), oval.centerY()); 
canvas.drawPath(path, paint); 

espero que esto ahorra algunos dolores de cabeza a las personas que no están familiarizados con la API de lienzo como a mí mismo.