studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android android-imageview

programacion - Android cómo aplicar máscara en ImageView?



manual de programacion android pdf (3)

Así que probé el código desde aquí: crear un ImageView con una máscara . Estoy usando las siguientes imágenes como original y máscara:

Sin embargo, el resultado que obtengo es este:

Tenga en cuenta que el fondo de la ventana no es negro, sino holo light (que en el nexo galaxia se ve como un gris muy pálido, no completamente blanco). La segunda imagen es el resultado que obtengo cuando se selecciona un elemento en una vista de lista.

Si, en cambio, creo un nuevo mapa de bits usando el mismo algoritmo y luego lo paso a la vista de imagen en lugar de anular onDraw (), dibuja correctamente:

Canvas canvas = new Canvas(); Bitmap mainImage = //get original image Bitmap maskImage = //get mask image Bitmap result = Bitmap.createBitmap(mainImage.getWidth(), mainImage.getHeight(), Bitmap.Config.ARGB_8888); canvas.setBitmap(result); Paint paint = new Paint(); paint.setFilterBitmap(false); canvas.drawBitmap(mainImage, 0, 0, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); canvas.drawBitmap(maskImage, 0, 0, paint); paint.setXfermode(null); imageView.setImageBitmap(result);

Obtengo el resultado esperado:

Tenga en cuenta que el fundido se aplica correctamente. Esto es más evidente cuando se realiza una selección.

Entonces, ¿qué está sucediendo en el método onDraw de ImageView para crear este fondo negro en lugar de dejar ver el fondo de la ventana? Lo que es interesante es que si la imagen original en sí tiene cierta transparencia, esa transparencia se respeta, por ejemplo:

No puedo resolverlo por mi cuenta. Prefiero ser capaz de hacerlo en onDraw en lugar de crear previamente el mapa de bits porque solo funciona para mapas de bits como fuente y máscara. Quiero poder hacerlo con otros estilos como degradados y colores sólidos, pero en esos casos el ancho y el alto no están configurados.


En este código, aplique:

mask_over = BitmapFactory.decodeResource( getResources(), mask_over1[0]); icon = Bitmap.createScaledBitmap(icon, screenwidth, screenwidth, false); mask_over = Bitmap.createScaledBitmap(mask_over, screenwidth, screenwidth, false); back_img=createBitmap_ScriptIntrinsicBlur(Bitmap.createScaledBitmap(cropview.croppedImage, screenwidth, screenwidth, false),25.0f); LinearLayout.LayoutParams layoutParams111 = new LinearLayout.LayoutParams(screenwidth, screenwidth);


He encontrado la combinación perfecta para crear enmascaramiento sin borde negro después de investigar a través de todas las publicaciones de . Se adapta bastante bien a mi propósito.

Actualmente estoy creando una vista que se puede arrastrar usando una imagen normal y una imagen enmascarante (una png con transparencia), así que tendré que anular la función onDraw.

private Bitmap mImage = ...; private Bitmap mMask = ...; // png mask with transparency private int mPosX = 0; private int mPosY = 0; private final Paint maskPaint; private final Paint imagePaint; public CustomView (final Context context) { maskPaint = new Paint(); maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); imagePaint = new Paint(); imagePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OVER)); } /* TODO if you have more constructors, make sure you initialize maskPaint and imagePaint Declaring these as final means that all your constructors have to initialize them. Failure to do so = your code won''t compile. */ @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.save(); canvas.drawBitmap(mMask, 0, 0, maskPaint); canvas.drawBitmap(mImage, mPosX, mPosY, imagePaint); canvas.restore(); }


Respondiendo mi propia pregunta. El Xfermode funcionaba como se esperaba. La pintura estaba haciendo que el resultado fuera del lienzo transparente (que era el lienzo utilizado por la actividad de la ventana). Como el lienzo en sí estaba siendo transparente, la ventana mostraba lo que había detrás: el fondo negro.

Para hacerlo correctamente, de hecho, se debe crear un nuevo mapa de bits para contener el resultado de la máscara alfa. Actualicé el código para tener en cuenta los objetos descartables de todo tipo.