2010-05-12 26 views
13

Estoy trabajando con Android 2.1 y tengo el siguiente problema: Usando el método View.getDrawingCache() siempre devuelve null. getDrawingCache() debería devolver un mapa de bits, que es la presentación del contenido de View.El método getDrawingCache() de Android 2.1 View siempre devuelve nulo

código Ejemplo:

public void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.main); 

    final View view = findViewById(R.id.ImageView01); 
    view.setDrawingCacheEnabled(true); 
    view.buildDrawingCache(); 
    final Bitmap bmp = view.getDrawingCache(); 
    System.out.println(bmp); 

}

ya he intentado diferentes maneras de configurar la vista de objetos para generar la caché de dibujo (por ejemplo View.setWillNotDraw(boolean) y View.setWillNotCacheDrawing(boolean)), pero nada funciona.

¿Cuál es la manera correcta, o lo que estoy haciendo mal?

PD: En código real, quiero aplicar getDrawingCache() en un ViewGroup como RelativeLayout. ¿Es el comportamiento el mismo cuando se usa un ViewGroup?

+0

Tengo el mismo problema en 2.1, 2.2 guarda el mapa de bits correctamente. –

+0

Esto debería funcionar - http://stackoverflow.com/questions/11560882/call-to-getdrawingcache-fails-on-api-8-everytime – Ronnie

Respuesta

0

Por lo que he leído los últimos días en la documentación, solo debe establecer SetrawCacheEnabled o buildDrawingChache() pero no ambos.

+0

Sé que setDrawingCacheEnabled y buildDrawingChache son redundantes. setDrawingCacheEnabled obliga a construir el caché de dibujo a pedido y buildDrawingChache crea el caché sin establecer el enable-flag. pero no funciona para mí, ni solo establece el indicador, ni usa la llamada explícita buildDrawingChache sin configurar el indicador. – Impression

5

uso

onLayout(x, y, width, height); 

para excepto:

onLayout(0, 0, 100, 100); 

antes de llamar getDrawingCache

+0

thx ... que funciona – Impression

+1

No funciona: El método onLayout (booleano, int, int, int) del tipo LinearLayout no está visible –

+3

es simplemente: layout.layout (0, 0, wt, ht); –

17
Bitmap screenshot; 
view.setDrawingCacheEnabled(true); 
screenshot = Bitmap.createBitmap(view.getDrawingCache()); 
view.setDrawingCacheEnabled(false); 

Es necesario Bitmap.createBitmap(view.getDrawingCache()); como el mapa de bits de la que la referencia es recibida por getDrawingCache() se recicla.

+4

¡No funciona para mí! Dice: la fuente es nula en Bitmap.createBitmap() –

2

¡Nunca haga estas cosas en onCreate! Puede hacerlo en View.onClickListener u otro lugar.

0

tenían el mismo problema y, finalmente, esta parte funciona para mí:

view.layout(0, 0, 1000, 100); 
Bitmap b = view.getDrawingCache(); 
try { 
    b.compress(CompressFormat.JPEG, 95, 
    new FileOutputStream(Environment.getExternalStorageDirectory()               + "/folder/name.jpg")); 
catch (FileNotFoundException e) { 
    Log.e(LOGTAG, "error:" + e.getMessage()); 
    } 

el único problema es que no puedo conseguir todas las dimensiones de mi punto de vista. view.getwidth devuelve nulo ...

0

Compruebe si su vista no es más grande que el tamaño de la pantalla. He encontrado esto y cambiaron las dimensiones de mi punto de vista es así, ahora funciona =) Android get full View as Bitmap

2

Sé que esto no responde a su pregunta, pero ....

Como nota aparte para otros desarrolladores de lectura esto, si lo que realmente intenta hacer es tener acceso a los contenidos de una vista personalizada, obtenga su vista personalizada desde un ImageView. Y luego cree un lienzo y mapa de bits que va a controlar/dibujar/leer y use setImageBitmap() para establecer su mapa de bits en el objeto de vista. A partir de allí, puede ignorar el lienzo que se le pasó en el método onDraw (lienzo) y simplemente dibujar en su lienzo/mapa de bits local.

¿Por qué necesita esto? En mi opinión, hay un descuido en la clase Canvas. La clase Canvas no le permite leer el contenido del lienzo ni acceder al mapa de bits subyacente. Por lo tanto, si alguna vez necesita leer un mapa de bits, por ejemplo para adquirir un volcado de imágenes del contenido de la vista, no hay forma de que yo sepa hacerlo, a excepción del método descrito anteriormente.

Esto no funcionará para el problema RelativeView descrito originalmente aquí en este hilo, pero esto podría ser de interés para los nuevos desarrolladores de Android.

Cuestiones relacionadas