Android: mapa de bits de una vista de gran tamaño

DESCRIPCIÓN DEL PROBLEMA:
He probado los dos métodos siguientes, con el fin de crear un snaphot de mapa de bits de una vista (por ejemplo, un RelativeLayout en este caso). Ambos métodos funcionan muy bien para Views, cuyas dimensiones (por ejemplo, anchura y altura) son menores que las dimensiones de la pantalla del dispositivo (por ejemplo, 480×900). La parte visible de la vista se captura y se escribe en el mapa de bits. Desafortunadamente, el mapa de bits es negro en la parte invisible de la vista.

PREGUNTA:
¿Cómo puedo capturar también la parte invisible de la vista?

CÓDIGO:

public class NewRelativeLayout extends RelativeLayout{ private Bitmap bmp; public NewRelativeLayout(Context context){ super(context); this.setLayoutParams(new RelativeLayout.LayoutParams(2000,2000)); // add here methods to configure the RelativeLayout or to add children } //This is the first method public void makeSnapshot_Method1(){ this.setDrawingCacheEnabled(true); bmp = Bitmap.createBitmap(this.getDrawingCache()); this.setDrawingCacheEnabled(false); } //This is the second method public void makeSnapshot_Method2(){ bmp = Bitmap.createBitmap(2000, 2000, Bitmap.Config.ARGB_8888); Canvas helpCanvas = new Canvas(bmp); this.draw(helpCanvas); } 

}

Yo estaba buscando la solución a esto también y, al final, se las arregló para llegar a mi propia solución que es realmente muy simple.

En mi caso, tenía un LinearLayout que contenía una serie de elementos de View , algunos de los cuales a veces no estaban en la pantalla, verticalmente por debajo del final de los límites de la pantalla. Fui capaz de guardar la View como un mapa de bits (véase loadBitmapFromView() , a continuación), pero tuvo problemas cuando se extendió más allá de la parte inferior de la pantalla.

Mi solución fue hacer que la parte LinearLayout de un compuesto ScrollView .

p.ej

Esta:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/my_linear_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <!-- Some Views added here at runtime --> </LinearLayout> 

Convirtió:

Tenga en cuenta el uso de wrap_content para garantizar ScrollView escalas a la altura de su contenido.

 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/scroll" android:layout_width="fill_parent" android:layout_height="wrap_content" > <LinearLayout android:id="@+id/my_linear_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <!-- Some Views added here at runtime --> </LinearLayout> </ScrollView> 

Esto parecía asegurar que los elementos fuera de pantalla se podían establecer manualmente cuando quería guardar la View como un mapa de bits. He utilizado el siguiente método para guardar el mapa de bits. Encontré esto mucho más temprano sobre SO pero no puedo parecer encontrar la pregunta para referirla correctamente (quienquiera que usted es – gracias!).

Para el siguiente método, paso una referencia al LinearLayout anterior ( my_linear_layout ).

 public static Bitmap loadBitmapFromView(View view) { Bitmap bitmap = null; // width measure spec int widthSpec = View.MeasureSpec.makeMeasureSpec( view.getMeasuredWidth(), View.MeasureSpec.AT_MOST); // height measure spec int heightSpec = View.MeasureSpec.makeMeasureSpec( view.getMeasuredHeight(), View.MeasureSpec.AT_MOST); // measure the view view.measure(widthSpec, heightSpec); // set the layout sizes int left = view.getLeft(); int top = view.getTop(); int width = view.getMeasuredWidth(); int height = view.getMeasuredHeight(); int scrollX = view.getScrollX(); int scrollY = view.getScrollY(); view.layout(left, top, width + left, height + top); // create the bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); // create a canvas used to get the view's image and draw it on the // bitmap Canvas c = new Canvas(bitmap); // position the image inside the canvas c.translate(-view.getScrollX(), -view.getScrollY()); // get the canvas view.draw(c); return bitmap; } 

Depende de la imagen que desee capturar, de la imagen del fondo o del primer plano de la vista. De cualquier manera usted tiene que conseguir el objeto Drawable de ellos, los arroja a BitmapDrawable y consigue el mapa de bits de su. Código:-

 BitmapDrawable bd=(BitmapDrawable) view.getBackground(); //if you need background image BitmapDrawable bd=(BitmapDrawable) view.getDrawable(); //if you need foreground image (Only available to some views who have an android:src xml property) Bitmap bm=bd.getBitmap(); 

Espero que esto funcione para tí.

También estoy tratando de averiguar esto para un ListView, para obtener todas las filas que no están en la pantalla.

He encontrado muchas cosas que me gustaría compartir:

Aquí alguien pregunta si un mapa de bits se puede crear desde una vista que no se dibuja: Mapa de bits de Vista no se muestra en Android

Aquí dicen que es un duplicado y también se responde correctamente (?) Contiene una URL con cierta codificación que es antigua y no compila. También la posible pregunta duplicada no me ayudó. Android obtiene una vista completa como mapa de bits

Creo que voy a tratar de hacerlo a través de este método: Vista de lista con mapa de bits Ya surgió con la misma idea, ahora todavía tengo que descubrir cómo.

Espero que pueda usar algo de esta información.

  • Cómo escuchar el botón de búsqueda del teclado en searchView
  • Android Material Design SearchView
  • ¿Por qué la vista personalizada no invalida?
  • ¿Cómo puedo reconocer qué área de una imagen (no sólo las coordenadas) se ha tocado en Android?
  • No se puede resolver el símbolo 'NavigationView'
  • Derecho a la izquierda ProgressBar?
  • GridView getChildAt () devuelve null
  • ¿Es posible desactivar el HeaderLayout que se puede hacer clic en NavigationView?
  • Diferencia entre el relleno y el margen de una vista
  • Obtener el id de una vista como String en el evento onClick
  • Android: superposición en la ventana sobre las actividades de una tarea
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.