2012-02-15 13 views
6

DESCRIPCIÓN DEL PROBLEMA:
He probado los siguientes dos métodos para crear una instantánea de mapa de bits desde una vista (por ejemplo, un RelativeLayout en este caso). Ambos métodos funcionan de manera excelente para Vistas cuyas dimensiones (por ejemplo, ancho y alto) son menores que las dimensiones de la pantalla del dispositivo (por ejemplo, 480x900). 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 no visible de la Vista.Android: mapa de bits de vista de gran tamaño

PREGUNTA:
¿Cómo puedo capturar también la parte no visible 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); 
    } 

}

Respuesta

0

depende de cuál es la imagen que desea capturar, la imagen de fondo o el primer plano de la vista. De cualquier forma, debe obtener el objeto Drawable de ellos, convertirlos a BitmapDrawable y obtener el Bitmap de ellos. 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 va a funcionar para usted.

+0

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? –

+0

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

+0

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

0

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

he encontrado un montón de cosas que me gustaría compartir:

Aquí alguien le pregunta si un mapa de bits se puede crear desde una vista que no ha dibujado: Bitmap from View not displayed on Android

aquí que dicen que es un duplicado y es también respondió correctamente (?) Contiene una URL con alguna codificación que es antigua y no compila. Además, la posible pregunta duplicada no me ayudó. Android get full View as Bitmap

creo que voy a tratar de lograr que se haga a través de este método: List View using bitmap Ya le ocurrió la misma idea, ahora todavía tengo que descubrir cómo.

Espero que pueda usar algo de esta información.

1

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; 
} 
Cuestiones relacionadas