Android: ¿Cómo overlay-a-bitmap / draw-over un mapa de bits?

En realidad tengo dos preguntas:

  1. ¿Es mejor dibujar una imagen en un mapa de bits o crear un mapa de bits como recurso y luego dibujar sobre un mapa de bits? Rendimiento sabio … cuál es mejor?
  2. Si quiero dibujar algo transparente sobre un mapa de bits, ¿cómo lo haría?
  3. Si quiero superponer un mapa de bits transparente sobre otro, ¿cómo lo haría?

Lo siento por la larga lista, pero en interés del aprendizaje, me gustaría explorar los enfoques …

¡No puedo creer que nadie haya contestado esto todavía! ¡Un acontecimiento raro en SO!

1

La pregunta no tiene mucho sentido para mí. Pero enfermo darle una puñalada. Si estás preguntando sobre dibujo directo a un lienzo (polígonos, sombreado, texto, etc …) VS cargando un mapa de bits y blitting en el lienzo que dependerá de la complejidad de su dibujo. A medida que el dibujo se vuelve más complejo, el tiempo de CPU requerido aumentará en consecuencia. Sin embargo, blitting un mapa de bits en un lienzo siempre será un tiempo constante que es proporcional al tamaño del mapa de bits.

2

Sin saber qué "algo" es cómo puedo mostrarte cómo hacerlo? Usted debe ser capaz de averiguar # 2 de la respuesta de # 3.

3

Supuestos:

  • Bmp1 es el más grande de los dos
  • Usted quiere que ambos superpuestos desde la esquina superior izquierda.

    private Bitmap overlay(Bitmap bmp1, Bitmap bmp2) { Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig()); Canvas canvas = new Canvas(bmOverlay); canvas.drawBitmap(bmp1, new Matrix(), null); canvas.drawBitmap(bmp2, new Matrix(), null); return bmOverlay; } 

Puedes hacer algo como esto:

 public void putOverlay(Bitmap bitmap, Bitmap overlay) { Canvas canvas = new Canvas(bitmap); Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG); canvas.drawBitmap(overlay, 0, 0, paint); } 

La idea es muy simple: una vez que asocias un mapa de bits con un lienzo, puedes llamar a cualquiera de los métodos del lienzo para dibujar sobre el mapa de bits.

Esto funcionará para bitmaps que tengan transparencia. Un mapa de bits tendrá transparencia, si tiene un canal alfa. Mira Bitmap.Config . Es probable que desee utilizar ARGB_8888.

Importante: mira esta muestra de Android para las diferentes maneras en que puedes realizar el dibujo. Le ayudará mucho.

Rendimiento sabio (memoria-sabio, para ser exactos), los mapas de bits son los mejores objetos a utilizar, puesto que envuelven simplemente un mapa de bits nativo. Un ImageView es una subclase de View, y un BitmapDrawable contiene un mapa de bits dentro, pero también contiene muchas otras cosas. Pero esto es una simplificación excesiva. Puede sugerir un escenario específico de rendimiento para obtener una respuesta precisa.

 public static Bitmap overlayBitmapToCenter(Bitmap bitmap1, Bitmap bitmap2) { int bitmap1Width = bitmap1.getWidth(); int bitmap1Height = bitmap1.getHeight(); int bitmap2Width = bitmap2.getWidth(); int bitmap2Height = bitmap2.getHeight(); float marginLeft = (float) (bitmap1Width * 0.5 - bitmap2Width * 0.5); float marginTop = (float) (bitmap1Height * 0.5 - bitmap2Height * 0.5); Bitmap overlayBitmap = Bitmap.createBitmap(bitmap1Width, bitmap1Height, bitmap1.getConfig()); Canvas canvas = new Canvas(overlayBitmap); canvas.drawBitmap(bitmap1, new Matrix(), null); canvas.drawBitmap(bitmap2, marginLeft, marginTop, null); return overlayBitmap; } 

Si el propósito es obtener un mapa de bits, esto es muy simple:

 Canvas canvas = new Canvas(); canvas.setBitmap(image); canvas.drawBitmap(image2, new Matrix(), null); 

Al final, la imagen contendrá la superposición de imagen e imagen2.

Creo que este ejemplo definitivamente le ayudará a superponer una imagen transparente encima de otra imagen. Esto se hace posible dibujando las imágenes en lienzo y devolviendo una imagen de mapa de bits.

Leer más o descargar la demo aquí

 private Bitmap createSingleImageFromMultipleImages(Bitmap firstImage, Bitmap secondImage){ Bitmap result = Bitmap.createBitmap(firstImage.getWidth(), firstImage.getHeight(), firstImage.getConfig()); Canvas canvas = new Canvas(result); canvas.drawBitmap(firstImage, 0f, 0f, null); canvas.drawBitmap(secondImage, 10, 10, null); return result; } 

Y llamar a la función anterior en el botón de clic y pasar las dos imágenes a nuestra función como se muestra a continuación

 public void buttonMerge(View view) { Bitmap bigImage = BitmapFactory.decodeResource(getResources(), R.drawable.img1); Bitmap smallImage = BitmapFactory.decodeResource(getResources(), R.drawable.img2); Bitmap mergedImages = createSingleImageFromMultipleImages(bigImage, smallImage); img.setImageBitmap(mergedImages); } 

Para más de dos imágenes, puede seguir este enlace, cómo combinar varias imágenes de forma programática en android

 public static Bitmap createSingleImageFromMultipleImages(Bitmap firstImage, Bitmap secondImage, ImageView secondImageView){ Bitmap result = Bitmap.createBitmap(firstImage.getWidth(), firstImage.getHeight(), firstImage.getConfig()); Canvas canvas = new Canvas(result); canvas.drawBitmap(firstImage, 0f, 0f, null); canvas.drawBitmap(secondImage, secondImageView.getX(), secondImageView.getY(), null); return result; } 
  • Emular el botón Atrás con superposición en Android
  • Google Maps Android API v2 Superposición de rutas
  • Superposición sobre un ImageView en Android
  • Creación de una ventana de superposición del sistema (siempre en la parte superior)
  • Barra de navegación de Android superpuesta a mi vista
  • Android Map Rendimiento pobre debido a muchas superposiciones?
  • Pantalla de superposición en Android
  • Implementación de un mapa interior
  • Animación de superposición de Facebook
  • Mapas de Android NullPointerException ItemizedOverlay
  • Superposición de vista de aplicación de Android (HUD)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.