2012-05-13 1 views
6

Мне нужно создать обтравочную маску с формой кругового сектора.Круглая секционная обрезная маска с Path.addArc?

Я могу сделать один, используя следующие:

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

Я хочу, чтобы использовать его в качестве отсеченной, так что я пробовал:

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

Однако addArc не имеет параметр useCenter, поэтому я получаю не сектор, а сегмент.

ответ

12

Хорошо, кажется, что нет подходящего способа сделать это, используя обтравочную маску.

Однако существует альтернативный способ использования PorterDuffXfermode. См. Xfermodes в ApiDemos.

Я просто рисую сектор, используя drawArc над своим изображением с помощью оператора DST_OUT. Это делает часть изображения, покрытую сектором невидимой (не нарисованной).

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

Мне нужно было настроить библиотеку AChartEngine для Android, чтобы превратить круговую диаграмму в диаграмму пончиков. Мне нужно было заменить следующее:

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

с использованием класса Path для использования обрезки. Следующий код сделал работу для меня:

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

Я надеюсь, что это спасает от головной боли для людей, не знакомых с Canvas API, как я.

Смежные вопросы