2012-08-17 12 views
32

Qual è la differenza tra setImageBitmap e setImageDrawable?Android - ImageView: setImageBitmap VS setImageDrawable

Ho un'immagine che vorrei impostare dinamicamente dal file. Il tutorial che ho seguito dice di convertire il mio Bitmap in un BitmapDrawable e di impostarlo usando setImageDrawable. Ho notato che l'impostazione del direttamente con setImageBitmap funziona anche ma non noto alcuna differenza.

Bitmap image = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 
BitmapDrawable bitmapDrawable = new BitmapDrawable(image); 
imageView.setImageDrawable(bitmapDrawable); 

O

Bitmap image = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 
imageView.setImageBitmap(image); 
+0

Penso che nessuna differenza in questi due esempi concreti –

risposta

71

Non c'è differenza tra i due internamente setImageBitmap sta chiamando setImageDrawable.

Questi codice viene prelevata dal ImageView.java di AOSP

public void setImageBitmap(Bitmap bm) { 
    // if this is used frequently, may handle bitmaps explicitly 
    // to reduce the intermediate drawable object 
    setImageDrawable(new BitmapDrawable(mContext.getResources(), bm)); 
} 
+19

+1 per guardare la fonte Android. Uno dei vantaggi delle cose open source. – Jochem

+2

La differenza è tra il nuovo BitmapDrawable (Resource, Bitmap) e il costruttore deprecato new BitmapDrawable (Bitmap). Se si utilizza il deprecato, può verificarsi un problema di layout. – Informatic0re

+13

Non sono d'accordo con la conclusione. C'è una differenza: se si desidera ottimizzare una vista elenco con immagini, ad esempio, sarebbe meglio creare un esterno disegnabile del thread dell'interfaccia utente e assegnarlo a ogni visualizzazione di immagini nel thread dell'interfaccia utente. Se si utilizza una bitmap, la creazione del Drawable rallenterà il thread dell'interfaccia utente e l'elenco non scorrerà come veloce e scorrevole. – Snicolas

4

Entrambi i metodi sono validi e ottenere lo stesso risultato. Nel primo metodo si avvolge la bitmap attorno a un oggetto estraibile che è un'astrazione per tutto ciò che può essere disegnato in una vista.

La particolarità di Drawables è che consentono di eseguire tutti i tipi di operazioni sull'oggetto grafico che racchiudono (ridimensionamento, traduzione, opacità ecc.).

Una bitmap è un genere di drawable, si può imparare ulteriormente circa drawable qui: http://developer.android.com/guide/topics/resources/drawable-resource.html

Nel secondo metodo, si accede direttamente i bit bitmap senza operazioni relative disegnabili e semplicemente disegnare la bitmap come-è dal tuo punto di vista

Spero che questo aiuti, saluti, Max.

+0

Quindi, le operazioni di esecuzione sull'immagine sono l'unico vantaggio/differenza di conversione in un disegno? Ho accettato la risposta di nandeesh in quanto è più applicabile al mio utilizzo. – meeeee

+0

Sì, essenzialmente questo è il vantaggio o piuttosto l'applicazione dei drawable di Bitmap. –

15

In realtà, si può vedere la differenza, se si usa a volte null come argomento:

imageView.setImageDrawable(null); 
Drawable d = imageView.getDrawable(); // d == null 

imageView.setImageBitmap(null); 
Drawable d = imageView.getDrawable(); // d == some BitmapDrawable, != null 

quindi se si sta verificando per l'esistenza di un disegnabile in ImageView, fate attenzione di esso.

+1

QUESTA è la distinzione più importante, grazie per questo. Mi piace usare la logica di ImageView per verificare se è impostata, quindi funziona alla grande. – AutoM8R

0
public void setImageBitmap(Bitmap bm) { 
// if this is used frequently, may handle bitmaps explicitly 
// to reduce the intermediate drawable object 
setImageDrawable(new BitmapDrawable(mContext.getResources(), bm)); 
} 

forse la differenza è la mContext.getResources(), da mContext.getResources() può ottenere la densità del divice, in modo che il display sul sceen è diverso

8

ho appena scritto su un articolo per questo. Desidero essere in grado di rispondere alla tua domanda.

https://plus.google.com/112740367348600290235/posts/VNAfFLDcKrw

ImageView ha 4 API per specificare l'immagine. Quale usare? Qual è la differenza?

  1. setImageDrawable (drawable Drawable)
  2. setImageBitmap (bitmap bm)
  3. setImageResource (int reSID)
  4. setImageURI (URI uri)

ImageView, dal nome, viene utilizzato per mostra un'immagine. Ma cos'è un'immagine? A Bitmap è un'immagine non difficile da comprendere e per questo motivo viene utilizzato setImageBitmap. Tuttavia, internamente, lo ImageView ha un numero Drawable ma non uno Bitmap e questo è ciò che setImageDrawable per. Quando si chiama setImageBitmap, internamente, per prima cosa la bitmap verrà spostata su BitmapDrawable, che è IS-A Drawable, quindi chiamare setImageDrawable.

Ecco il codice.

public void setImageBitmap(Bitmap bm) { 
    setImageDrawable(new BitmapDrawable(mContext.getResources(), bm)); 
} 

Quindi, per quanto riguarda le API 3 e 4?

Dovresti già sapere che ci sono molti modi per creare una bitmap: da un percorso file, da un flusso di input, dall'URI o dal file di risorse.

BitmapFactory.decodeFile(String pathName) 
BitmapFactory.decodeStream(Inputstream) 
BitmapFactory.decodeResource(Resource res, int id) 
BitmapFactory.decodeByteArray(byte[] data) 

Consapevole di questo, è facile da capire setImageResource/setImageUri è proprio uguale a setImageBitmap.

Per riassumere, setImageDrawable è la funzione primitiva su cui si basano le altre API. Gli altri 3 sono solo metodi di supporto che ti fanno scrivere meno codice.

Inoltre, è molto importante tenere presente che lo ImageView ha effettivamente un valore Drawable, che non deve necessariamente essere un BitmapDrawable! È possibile impostare qualsiasi Drawable nella vista Immagine.

Oltre all'impostazione dello Drawable tramite l'API Java, è anche possibile utilizzare l'attribuzione XML per impostare l'origine Drawable per ImageView. Vedi l'esempio qui sotto. Si noti che la forma potrebbe essere un file immagine (.png, .jpg, .bmp) o un file xml.

+0

Ma quale chiamata API è più veloce? 'setImageDrawable' sembra essere il più veloce ma ciò che è con gli altri? – winklerrr

Problemi correlati