Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I antialias the clip boundary on Android's canvas?

I'm using Android's android.graphics.Canvas class to draw a ring. My onDraw method clips the canvas to make a hole for the inner circle, and then draws the full outer circle over the hole:

    clip = new Path();     clip.addRect(outerCircle, Path.Direction.CW);     clip.addOval(innerCircle, Path.Direction.CCW);      canvas.save();     canvas.clipPath(clip);     canvas.drawOval(outerCircle, lightGrey);     canvas.restore(); 

The result is a ring with a pretty, anti-aliased outer edge and a jagged, ugly inner edge:

aliased

What can I do to antialias the inner edge?

I don't want to cheat by drawing a grey circle in the middle because the dialog is slightly transparent. (This transparency isn't as subtle on on other backgrounds.)

like image 360
Jesse Wilson Avatar asked Apr 27 '10 07:04

Jesse Wilson


2 Answers

I know this is not a general answer, but in this particular case, you could draw arcs with a thick stroke width, instead of the circles + mask.

like image 34
HRJ Avatar answered Sep 28 '22 19:09

HRJ


As far as I know, you can't antialias clip regions.

I'd suggest using bitmap masking instead. Render the the pink, white, and light gray foreground to one bitmap, render the outer/inner circle mask (the grayscale alpha channel) to another bitmap, and then use Paint.setXfermode to render the foreground bitmap with the mask as its alpha channel.

An example can be found in the ApiDemos source code here.

like image 194
Roman Nurik Avatar answered Sep 28 '22 20:09

Roman Nurik