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?
- onTouchListener anula un fondo personalizado en la vista de botón?
- Clone textview para anexarlo a un ViewGroup
- View.getDrawingCache () sólo funciona una vez
- View.setBackground lanza NoSuchMethodError
- Contenedor personalizado para Android (hexagonal) con adaptador
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); }
}
- ¿Cómo hacer una devolución de llamada después de que la vista esté completamente renderizada?
- Cómo agregar vista de superposición sobre otra vista en android?
- Debe pasar en una vista no nula
- Se debe hacer clic en SearchView dos veces para abrir
- Página Curl Animation en android?
- Android: cómo determinar la última letra totalmente visible en TextView?
- Cómo mover un contenido de diseño fuera de la pantalla de Android
- Cómo configurar el adaptador para searchview en la barra de acciones
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.
- Problema extraño en la vista web de Android con lienzo
- Edificio Gradle tarda una eternidad después de actualizar a Java 8