Ver Mensaje Individual
  #5  
Viejo 21/04/13, 15:29:31
Array

[xs_avatar]
Dild0 Dild0 no está en línea
Usuario muy activo
 
Fecha de registro: may 2009
Mensajes: 860
Tu operador: Pepephone

 Cita: Originalmente Escrito por kriogeN Ver Mensaje
Yo tengo una clase que hace eso.

Código:
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.ImageView;

public class MaskedImageView extends ImageView{
	Resources resources;

	public MaskedImageView(Context context, AttributeSet attrs) {
		super(context, attrs);
		
		resources = context.getResources();
	}
	
	@Override
	public void setImageBitmap(Bitmap original) {
		
		if (original==null)
			return;
		
		Bitmap mask = BitmapFactory.decodeResource(resources,R.drawable.item_usuario_fotomask);
		Bitmap result = Bitmap.createBitmap(mask.getWidth(), mask.getHeight(), Config.ARGB_8888);
		Bitmap back = BitmapFactory.decodeResource(resources,R.drawable.item_usuario_fotoback);
		Canvas c = new Canvas(result);
		Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
		paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
		c.drawBitmap(original,  new Rect(0, 0, original.getWidth(), original.getHeight()),
				 new Rect(0, 0, mask.getWidth(), mask.getWidth()), null);
		c.drawBitmap(mask, new Rect(0, 0, mask.getWidth(), mask.getHeight()),
				 new Rect(0, 0, mask.getWidth(), mask.getWidth()), paint);
		c.drawBitmap(back, new Rect(0, 0, back.getWidth(), back.getHeight()),
				 new Rect(0, 0, mask.getWidth(), mask.getWidth()), null);
		paint.setXfermode(null);
		super.setImageBitmap(result);
	}
}
La clase se puede mejorar mucho, para que el Back y el Mask sean parámetros en el XML por ejemplo, pero por lo pronto para salir del paso te valdrá. También se puede hacer para que funcione con setImageDrawable, pero las pruebas que he hecho no me han salido bien.

Vas a necesitar 2 imágenes:

- Back: Una imagen normal y corriente, será la imagen que se verá de fondo en las zonas que la imagen original no se dibuje.

- Mask: Es una imagen negativa de las zonas que quieres que sean transparentes en la imagen original, es decir, esta imagen tendrá 2 colores (puede tener más, pero al final será como si fuesen 2). Color blanco para las zonas que quieres que se dibuje Back, color distinto de blanco (por ejemplo negro) para las zonas donde quieres que se dibuje Original.

Por ejemplo, tienes una imagen Original cualquiera, y tienes una imagen Back cualquiera. Y la imagen Mask es un fondo blanco con un cuadrado de 10x10 en el centro.

Pues el resultado será una imagen que se verá la imagen Back, menos un cuadrado de 10x10 en el centro que se verá ESA ZONA de la imagen Original.

Espero haberte ayudado.

Voy a probar, de momento estaba haciendolo de la manera que me comento mocelet, extendiendo de imageview y modificando el ondraw con super, y la cosa va bien salvo por las puñeteras matematicas, las densidades de pantalla me estan volviendo loco...

jjeje ya os comentare, gracias

sl2
__________________
Responder Con Cita