Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Draw bitmap on current clip in canvas with border (Paint)

I'm learning Android by writing a game and have a problem with the graphics API.

I want to draw an image into shape of a Path and then add border on the Path. I was able to clip the image with Path but can't find a way to add border on it. I though it would be simple because the API supports Paint object on Canvas.draw* methods.

Update

In original question, my Path contains two rectangles and @christopher-souvey answered correctly. However, I get another problem when dealing with adding one more clipPath() method.

I updated previous code by adding one more circle into Path. Here is my new code:

Bitmap srcImage = BitmapFactory.decodeStream(getAssets().open("panda.jpg"));
Bitmap bitmapResult = Bitmap.createBitmap(srcImage.getWidth(), srcImage.getHeight(), Bitmap.Config.ARGB_8888);
Path path = new Path();

// This is my border
Paint paint = new Paint();
paint.setStyle(Style.STROKE);
paint.setColor(Color.RED);
paint.setStrokeWidth(2);
paint.setAntiAlias(true);

Canvas canvas = new Canvas(bitmapResult);

// Overlay two rectangles
path.addRect(10, 10, 70, 70, Path.Direction.CCW); 
path.addRect(40, 40, 120, 120, Path.Direction.CCW);
canvas.drawPath(path , paint);
canvas.clipPath(path, Region.Op.INTERSECT);

path.reset();
path.addCircle(40, 80, 20, Path.Direction.CCW); 
canvas.drawPath(path , paint);
canvas.clipPath(path, Region.Op.DIFFERENCE);

// The image is drawn within the area of two rectangles and a circle
// Although I suppose that puting Paint object into drawBitmap() method will add a red border on result image but it doesn't work
canvas.drawBitmap(srcImage, 0, 0, paint);

((ImageView)this.findViewById(R.id.imageView1)).setImageBitmap(bitmapResult);

Here is the result from my code: http://i.stack.imgur.com/8j2Kg.png

And this is what I expect: http://i.stack.imgur.com/iKhIr.png

Do I miss anything to make it work ?

like image 361
Duy Lam Avatar asked Nov 14 '22 21:11

Duy Lam


1 Answers

Try using canvas.drawPath(path, paint) after the drawBitmap You may have to put in a canvas.save before the clip and canvas.restore before the drawPath (I'm not sure if the stroke occurs inside or outside the path lines).

like image 122
Christopher Souvey Avatar answered Jan 03 '23 16:01

Christopher Souvey