Рисование «дыр» в холсте

Я пытаюсь нарисовать такую ​​форму в методе onDraw пользовательского представления.

К сожалению, я не могу «разрезать» прозрачный круг на холсте (рисуя круг с помощью Color.Transparent).

Должен ли я сначала нарисовать фигуру в другой растровой картинке, а затем нарисовать ее на холсте, предоставленном onDraw? Или это лучший (более простой) способ сделать это?

Пользовательская форма

Вот код, который я пробовал (работает с Color.WHITE):

mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setColor(Color.TRANSPARENT); mPaint.setStrokeWidth(4); mPaint.setStyle(Style.STROKE); canvas.drawColor(getResources().getColor(R.color.black_overlay)); canvas.drawCircle(-3*(this.getBottom()-this.getTop())/4, (this.getTop()+this.getBottom())/2, this.getBottom()-this.getTop(), mPaint); 

PS: Я получил точную форму, которую я хотел, используя Color.WHITE: Результат, достигнутый с помощью Color.WHITE

Решение

 @Override public void onDraw(Canvas canvas) { mBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); mCanvas = new Canvas(mBitmap); mCanvas.drawColor(getResources().getColor(R.color.black_overlay)); mCanvas.drawCircle(-3*(getHeight())/4, (getHeight())/2, getHeight(), mPaint); canvas.drawBitmap(mBitmap, 0, 0, null); } with mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setStrokeWidth(4); mPaint.setStyle(Style.STROKE); mPaint.setXfermode(new PorterDuffXfermode(Mode.CLEAR)); 

Примечание: createBitamp и новый холст должны быть перемещены из метода onDraw.

Solutions Collecting From Web of "Рисование «дыр» в холсте"