2012-05-13 21 views
6

Ho bisogno di creare una maschera di ritaglio con una forma di un settore circolare.Maschera di ritaglio a forma di settore circolare con Path.addArc?

sono in grado di disegnare una utilizzando la seguente:

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

voglio usarlo come un tracciato di ritaglio, così ho provato:

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

Tuttavia addArc non hai il parametro useCenter quindi quello che ottengo non è un settore ma un segmento.

risposta

12

Ok, sembra che non ci sia modo corretto di farlo usando una maschera di ritaglio.

Tuttavia esiste un modo alternativo utilizzando PorterDuffXfermode. Vedi Xfermodes in ApiDemos.

Ho semplicemente disegnato un settore utilizzando drawArc sulla mia immagine con l'operatore DST_OUT. Ciò rende invisibile la parte dell'immagine coperta dal settore (non disegnata).

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

avevo bisogno di modificare la libreria AChartEngine per Android per accendere il grafico a torta in un grafico ad anello. Ho dovuto sostituire quanto segue:

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

utilizzando la classe Path per poter utilizzare il clipping. Il seguente codice ha fatto il lavoro per me:

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

spero che questo consente di risparmiare qualche mal di testa per le persone che non hanno familiarità con l'API Canvas come me stesso.

Problemi correlati