2013-05-11 12 views
5

Sto tentando di acquisire uno screenshot del contenuto di un LinearLayout. Il layout contiene una scrollview che può essere di altezza/larghezza variabile. Questo codice funziona bene quando il layout non è troppo grande (vale a dire che non è necessario scorrere molto fuori dallo schermo per vedere tutto):Visualizza troppo grande per adattarsi alla cache di disegno quando si chiama getDrawingCache()

View v1 = (LinearLayout)theLayout; 

v1.setDrawingCacheEnabled(true); 
Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache()); 
v1.setDrawingCacheEnabled(false); 

Tuttavia, se il LinearLayout che sto cercando di catturare è di grandi dimensioni , quindi l'applicazione si blocca con un puntatore nullo su v1.getDrawingCache().

C'è un errore nel logcat:

05-11 13: 16: 20,999: W/View (17218): Vista troppo grande per entrare in disegno cache, bisogna 4784400 byte, solo 3.932.160 disponibili

Come posso prendere correttamente uno screenshot di questo layout? C'è un altro modo per farlo che non usa così tanta memoria?

+1

http://stackoverflow.com/questions/9791714/take-a-screenshot-of-a-whole-view. controlla la risposta di kameltreiber – Raghunandan

+0

Grazie - ho dovuto modificare leggermente la soluzione su quella risposta, ma l'ho fatta funzionare! – DiscDev

risposta

12

Ecco cosa finito per lavorare per me, per catturare una grande vista fuori dallo schermo nella sua interezza:

public static Bitmap loadBitmapFromView(View v) 
{ 
    Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888); 

    Canvas c = new Canvas(b); 
    v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height); 
    v.draw(c); 
    return b; 
} 

E 'simile alla risposta here, se non che io uso larghezza/altezza della vista per creare il bitmap

+0

Per assicurarsi che funzioni in tutte le situazioni, è necessario chiamare anche measure() prima di layout(). –

+0

Giusto per aggiungere che questo funziona anche per le viste che sono completamente invisibili (visibility == invisible), che era il mio caso. – helleye

+0

Cosa fare se si desidera modificare le dimensioni della bitmap risultante? –

1

Come la domanda originale sta parlando di un ScrollView, ma vorrei aggiungere il seguente per chiunque avesse problemi a raggiungere la piena altezza. Per ottenere l'altezza del ScrollView, il v.getHeight non funziona, è necessario utilizzare:

v.getChildAt(0).getHeight() 

quindi la cosa completa sarebbe:

ScrollView scrollView = (ScrollView) result.findViewById(R.id.ScrlView); 

loadBitmapFromView(scrollView); 

public static Bitmap loadBitmapFromView(View v) 
{ 
int height = v.getChildAt(0).getHeight() 
int width = v.getWidth() 
Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 

Canvas c = new Canvas(b); 
v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height); 
v.draw(c); 
return b; 
} 

Usando solo v.getHeight ottiene solo l'altezza dello schermo, non l'altezza completa di ScrollView.

Problemi correlati