Trataré de explicar qué es exactamente lo que tengo que hacer.
Tengo 3 pantallas separadas que dicen A, B, C. Hay otra pantalla llamada say HomeScreen donde las 3 pantallas de mapa de bits deben mostrarse en la vista Galería y el usuario puede seleccionar a qué vista quiere ir.
He podido obtener los mapas de bits de las 3 pantallas y mostrarlo en la vista Galería colocando todo el código solo en la Actividad de la pantalla de inicio. Ahora, esto ha complicado mucho el código y me gustaría simplificarlo.
Entonces, ¿puedo llamar a otra Actividad desde HomeScreen y no mostrarla y solo obtener el Bitmap de esa pantalla? Por ejemplo, supongamos que llamo a HomeScreen y llama a la Actividad A, B, C y no se muestra ninguna de las Actividades de A, B, C. Simplemente proporciona el mapa de bits de esa pantalla mediante getDrawingCache (). Y luego podemos mostrar esos mapas de bits en la vista Galería en la pantalla de inicio.
Espero haber explicado el problema muy claramente.
Por favor, avíseme si esto es realmente posible.
Respuestas:
hay una forma de hacer esto. debe crear un mapa de bits y un lienzo y llamar a view.draw (lienzo);
Aquí está el código:
si la vista no se mostró antes de que su tamaño sea cero. Es posible medirlo así:
EDITAR: según esta publicación , pasar
WRAP_CONTENT
como valor amakeMeasureSpec()
no sirve para nada (aunque para algunas clases de vista funciona), y el método recomendado es:fuente
v.layout(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
que funcione correctamente, pero gracias por el código :)v.measure(0, 0); v.getMeasuredWidth(); v.getMeasuredHeight();
.Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
Funciona mejorAquí está mi solución:
Disfruta :)
fuente
Prueba esto,
fuente
Sé que esto puede ser un problema rancio, pero estaba teniendo problemas para que alguna de estas soluciones funcione para mí. Específicamente, descubrí que si se realizaban cambios en la vista después de inflarlos, esos cambios no se incorporarían al mapa de bits representado.
Aquí está el método que terminó funcionando para mi caso. Con una advertencia, sin embargo. antes de llamar
getViewBitmap(View)
, inflé mi vista y le pedí que diseñara con dimensiones conocidas. Esto era necesario ya que mi diseño de vista lo haría cero altura / ancho hasta que el contenido se colocara dentro.La "salsa mágica" para mí se encontró aquí: https://groups.google.com/forum/#!topic/android-developers/BxIBAOeTA1Q
Salud,
Levi
fuente
measure()
ylayout()
antes de llenar mi vista, así que tuve resultados extraños. Mover estas llamadas hacia abajo, arriba locreateBitmap()
arregló para mí!Hay una gran función de extensión de Kotlin en Android KTX:
View.drawToBitmap(Bitmap.Config)
fuente
Espero que esto ayude
El
getDrawingCache()
método de actualización está en desuso en el nivel de API 28. Por lo tanto, busque otra alternativa para el nivel de API> 28.fuente
getDrawingCache
Actualmente está en desuso.Diseño o vista al mapa de bits:
Método de llamada:
fuente
Creo que esto es un poco mejor:
Usando el código anterior, no tiene que especificar el tamaño del mapa de bits (use 0 para ancho y alto) si desea usar el de la vista en sí.
Además, si desea convertir vistas especiales (SurfaceView, Surface o Window, por ejemplo) en un mapa de bits, debería considerar usar la clase PixelCopy en su lugar. Sin embargo, requiere API 24 y superior. No sé cómo hacerlo antes.
fuente
fuente