Круговая секционная обрезная маска с 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, поэтому я получаю не сектор, а сегмент.

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

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

Я просто рисую сектор, используя drawArc поверх своего изображения с DST_OUT оператора 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); 

Мне нужно было настроить библиотеку 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, как я.

Intereting Posts