2010-05-12 20 views
13

Sto lavorando con Android 2.1 e ho il seguente problema: Utilizzando il metodo View.getDrawingCache() restituisce sempre null. getDrawingCache() dovrebbe restituire un Bitmap, che è la presentazione del contenuto di View.Il metodo getDrawingCache() di Android 2.1 View restituisce sempre null

codice Esempio:

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); 

}

ho già provato diversi modi per configurare la visualizzazione di oggetti per generare la cache di disegno (per esempio View.setWillNotDraw(boolean) e View.setWillNotCacheDrawing(boolean)), ma non funziona niente.

Qual è il modo giusto o cosa sto facendo male?

PS: nel codice reale voglio applicare getDrawingCache() su un ViewGroup come RelativeLayout. Il comportamento è lo stesso quando si utilizza un ViewGroup?

+0

Ho lo stesso problema in 2.1, 2.2 salva correttamente la bitmap. –

+0

Questo dovrebbe funzionare - http://stackoverflow.com/questions/11560882/call-to-getdrawingcache-fails-on-api-8-everytime – Ronnie

risposta

0

Per quanto riguarda gli ultimi giorni della documentazione, è necessario selezionare soloDrawingCacheEnabled o buildDrawingChache() ma non entrambi.

+0

So che setDrawingCacheEnabled e buildDrawingChache sono ridondanti. setDrawingCacheEnabled costringe a creare la cache di disegno su richiesta e buildDrawingChache crea la cache senza impostare il flag di abilitazione. ma non funziona per me - né solo l'impostazione della bandiera, né l'uso della chiamata esplicita buildDrawingChache senza impostare la bandiera. – Impression

5

uso

onLayout(x, y, width, height); 

es:

onLayout(0, 0, 100, 100); 

prima di chiamare getDrawingCache

+0

thx ... che funziona – Impression

+1

Non funziona neanche: il metodo onLayout (booleano, int, int, int, int) dal tipo LinearLayout non è visibile –

+3

è solo: layout.layout (0, 0, wt, ht); –

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

È necessario Bitmap.createBitmap(view.getDrawingCache()); come bitmap da cui viene ricevuto dal getDrawingCache() il riferimento viene riciclato.

+4

Non funziona per me! Says: source è null su Bitmap.createBitmap() –

2

Mai fare queste cose su onCreate! Puoi farlo in un View.onClickListener o in un altro posto.

0

avuto lo stesso problema e, infine, questa parte funziona per me:

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()); 
    } 

l'unico problema è, che non riesco a ottenere le dimensioni complete del mio punto di vista. view.getwidth returns null ...

0

Controlla se la tua vista non è più grande della dimensione dello schermo. Ho trovato questo e acceso le dimensioni del mio punto di vista è così, ora funziona =) Android get full View as Bitmap

2

So che questo non risponde alla tua domanda, ma ....

Proprio come un a parte per gli altri sviluppatori di lettura questo, se quello che stai veramente cercando di fare è avere accesso ai contenuti di una vista personalizzata, ricava la tua vista personalizzata da un ImageView. Quindi creare una tela e una bitmap che si intende controllare/disegnare in/leggere e utilizzare setImageBitmap() per impostare la bitmap nell'oggetto della vista. Da lì in avanti puoi ignorare la tela passata a te nel metodo onDraw (canvas) e invece disegnare nel canvas/bitmap locale.

Perché avresti bisogno di questo? Secondo me, c'è una svista nella classe Canvas. La classe Canvas non consente di leggere il contenuto della tela né di ottenere la bitmap dietro di essa. Quindi, se hai sempre bisogno di leggere da una bitmap, ad esempio per acquisire un dump dell'immagine dei contenuti della vista, non c'è modo che io sappia farlo, a parte il metodo descritto sopra.

Questo non funzionerà per il problema RelativeView originariamente descritto qui in questa discussione ma questo potrebbe essere di interesse per i nuovi sviluppatori Android.

Problemi correlati