Estaba buscando la solución a esto también y, al final, logré encontrar mi propia solución, que en realidad es bastante simple.
En mi caso, tenía un LinearLayout
que contenía un número de View
elementos, algunos de los cuales a veces no estaban en la pantalla, verticalmente debajo del final de los límites de la pantalla. Pude guardar el View
como mapa de bits (vea loadBitmapFromView()
, abajo) pero tuve problemas cuando se extendía más allá de la parte inferior de la pantalla.
Mi solución fue hacer que la LinearLayout
formara parte de un compuesto ScrollView
.
p. Ej.
Este:
<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>
Se convirtió en:
Nota uso de wrap_content
para asegurar ScrollView escala 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 para asegurar que los elementos fuera de la pantalla podrían ser despedidos a cabo de forma manual cuando quería salvar el View
como mapa de bits. Usé el siguiente método para guardar el mapa de bits. Lo encontré mucho antes en SO, pero parece que no puedo encontrar la pregunta para referenciarla adecuadamente (quienquiera que seas, ¡gracias!).
Para el siguiente método, paso en 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;
}
Gracias Creador por su respuesta rápida. El método view.getDrawable() solo es compatible con Views, que "mantienen" una imagen de primer plano dentro como ImageView, por ejemplo. Todas las demás vistas como RelativeLayouts, LinearLayouts, TextViews, etc. no son compatibles con este método. La mayoría de los foros de Internet recomiendan el método 1 o 2 (ver mi publicación) para hacer una captura de pantalla de mapa de bits (es decir, fondo más primer plano) desde una Vista. El problema aún no está resuelto para Vistas sobredimensionadas. ¿Alguna otra idea? –
Bueno, ya he mencionado que view.getDrawable() no es compatible con todas las vistas en la publicación. Esos dos métodos dan la imagen completa, incluidas las partes fuera de la pantalla, puede intentar colocar esas dos imágenes separadas en una sola vista (si la original es una imagen png de fondo transparente) usando lienzo y vista personalizada y obtener el Dibujable desde allí, aunque nunca lo intenté, por lo que no puedo decir cómo funcionará, pero si pudiera seguir eso, podría lograr lo que necesita. – noob
El método getDrawingCache() está destinado a dar solo la imagen en pantalla solamente, por lo que no creo que funcione para usted. El uso de getDrawingCache (true) podría funcionar para usted. Otra idea podría ser cambiar el tamaño de la vista usando LayoutParams para ajustarse a la pantalla y luego obtener la memoria caché de dibujo desde allí. – noob