Mapa de bits de Android Mask en canvas gen un espacio negro

Tengo un bitmap de máscara con un medio es de color rojo y otros son transparentes como este http://sofes.miximages.com/android/s_2.png

Quiero usar el bitmap de la máscara para dibujar contenido en el canvas, solo visible en el área roja, código como este:

Paint paint = new Paint(); public void draw(Canvas canvas) { // draw content here ... //and mask bitmap here paint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.DST_IN)); canvas.drawBitmap(maskBitmap, 0, 0, paint); } 

El resultado es mi expectativa (¡el contenido solo es visible en el área roja, PERO EL ÁREA TRANSPARENTE SE CONVIERTE EN NEGRO ES PROBLEMA!)

este resultado de la imagen: http://sofes.miximages.com/android/s_2 copy.png ¿ Alguien me ayude?

Aquí hay una solución que me ayudó a implementar el enmascaramiento:

 public void draw(Canvas canvas) { Bitmap original = BitmapFactory.decodeResource(getContext().getResources(),R.drawable.original_image); Bitmap mask = BitmapFactory.decodeResource(getContext().getResources(),R.drawable.mask_image); //You can change original image here and draw anything you want to be masked on it. Bitmap result = Bitmap.createBitmap(mask.getWidth(), mask.getHeight(), Config.ARGB_8888); Canvas tempCanvas = new Canvas(result); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); tempCanvas.drawBitmap(original, 0, 0, null); tempCanvas.drawBitmap(mask, 0, 0, paint); paint.setXfermode(null); //Draw result after performing masking canvas.drawBitmap(result, 0, 0, new Paint()); } 

La máscara debe ser una imagen blanca con transparencia.
Funcionará así:
imagen original + máscara = imagen resultante

Encontré el mismo problema en mi vista personalizada y en lugar de decodificar el bitmap de un recurso, creé el bitmap original y el bitmap de enmascaramiento desde cero mediante los canvas.draw*() (ya que tanto el original como la máscara son formas básicas) ) Estaba obteniendo el blank opaque space lugar de uno transparent . Lo arreglé estableciendo una capa de hardware a mi vista.

 View.setLayerType(LAYER_TYPE_HARDWARE, paint); 

Más información sobre por qué esto se debe hacer aquí: https://stackoverflow.com/a/33483016/4747587

 Bitmap finalMasking = stackMaskingProcess(imageBitmap, bitmapMasking); private Bitmap stackMaskingProcess(Bitmap _originalBitmap, Bitmap _maskingBitmap) { try { if (_originalBitmap != null) { int intWidth = _originalBitmap.getWidth(); int intHeight = _originalBitmap.getHeight(); resultMaskBitmap = Bitmap.createBitmap(intWidth, intHeight, Bitmap.Config.ARGB_8888); getMaskBitmap = Bitmap.createScaledBitmap(_maskingBitmap, intWidth, intHeight, true); Canvas mCanvas = new Canvas(resultMaskBitmap); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); mCanvas.drawBitmap(_originalBitmap, 0, 0, null); mCanvas.drawBitmap(getMaskBitmap, 0, 0, paint); paint.setXfermode(null); paint.setStyle(Paint.Style.STROKE); } } catch (OutOfMemoryError o) { o.printStackTrace(); } return resultMaskBitmap; }