2012-08-17 40 views
32

¿Cuál es la diferencia entre setImageBitmap y setImageDrawable?Android - ImageView: setImageBitmap VS setImageDrawable

Tengo una imagen que me gustaría establecer dinámicamente desde el archivo. El tutorial que seguí dice para convertir mi Bitmap a BitmapDrawable y luego configurarlo usando setImageDrawable. Me he dado cuenta de que configurar el Bitmap directamente con setImageBitmap también funciona, pero no noto ninguna diferencia.

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

Creo que no hay diferencia en estos dos ejemplos concretos –

Respuesta

71

No hay ninguna diferencia entre los dos internamente setImageBitmap está llamando setImageDrawable.

continuación código es tomado de ImageView.java de 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 para buscar en la fuente de Android. Uno de los beneficios de las cosas de código abierto. – Jochem

+2

La diferencia está entre el nuevo BitmapDrawable (Resource, Bitmap) y el nuevo constructor en desuso BitmapDrawable (Bitmap). Si está utilizando el obsoleto, puede ocurrir un problema de diseño. – Informatic0re

+13

No estoy de acuerdo con la conclusión, así. Existe una diferencia: si desea optimizar una vista de lista con imágenes, sería mejor crear un Drawable outiside del UI Thread y asignarlo a cada vista de imagen en el subproceso de UI. Si usa un Mapa de bits, la creación del Drawable ralentizará el subproceso de UI y la lista no se desplazará tan rápido y sin problemas. – Snicolas

4

Ambos métodos son válidos y lograr el mismo resultado. En el primer método, ajusta su mapa de bits alrededor de un objeto dibujable que es una abstracción de todo lo que se puede dibujar en una Vista.

Lo especial de Drawables es que le permiten realizar todo tipo de operaciones en el objeto gráfico que envuelve (escalado, traslación, opacidad, etc.).

Un mapa de bits es un tipo de estirable, puede aprender más acerca dibujables aquí: http://developer.android.com/guide/topics/resources/drawable-resource.html

En el segundo método, se accede directamente a los bits de mapa de bits sin ningún tipo de operaciones relacionadas con dibujable y simplemente dibuja el mapa de bits en que está en su punto de vista.

Espero que esto ayude, aplausos, Max.

+0

¿Entonces realizar operaciones en la imagen es la única ventaja/diferencia de convertir a un dibujable? Acepté la respuesta de Nandeesh, ya que es más aplicable para mi uso. – meeeee

+0

Sí, esencialmente esta es la ventaja o más bien la aplicación de los elementos binarios de Bitmap. –

15

En realidad, es posible que vea la diferencia, si se utiliza a veces como un argumento null:

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

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

por lo que si usted está mirando por la existencia de un estirable en ImageView, tenga cuidado de ella.

+1

ESTA es la distinción más importante, gracias por esto. Me gusta utilizar la lógica de ImageView para comprobar si está configurada, por lo que funciona muy bien. – 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)); 
} 

tal vez la diferencia es la mContext.getResources(), de mContext.getResources() puede obtener la densidad de la Divice, por lo que la pantalla de sceen es diferente

8

simplemente escribí un artículo para esto. Desea poder responder su pregunta.

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

ImageView tiene 4 API para especificar la imagen. ¿Cuál usar? ¿Cuál es la diferencia?

  1. setImageDrawable (dibujable Disponibles)
  2. setImageBitmap (Bitmap bm)
  3. setImageResource (int Resid)
  4. setImageURI (URI uri)

ImageView, por el nombre, se utiliza para mostrar una imagen. Pero, ¿qué es una imagen? Una Bitmap es una imagen, no es difícil de entender y usamos setImageBitmap para tal fin. Sin embargo, internamente, el ImageView tiene-un Drawable pero no un Bitmap y para eso es setImageDrawable. Cuando llame al setImageBitmap, internamente, el mapa de bits se ajustará al BitmapDrawable, que es IS-A Drawable, y luego llamará al setImageDrawable.

Aquí está el código.

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

Entonces, ¿qué pasa con el 3 y 4 API?

Ya debe saber que hay muchos modos de crear un mapa de bits: desde una ruta de archivo, desde una secuencia de entrada, desde el Uri, o desde el archivo de recursos.

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

Consciente de ello, es fácil de entender setImageResource/setImageUri es simplemente igual que setImageBitmap.

En resumen, setImageDrawable es la función primitiva de la que dependen otras API. Los otros 3 son solo métodos auxiliares que te hacen escribir menos código.

Además, es muy importante tener en cuenta que ImageView realmente tiene un Drawable, que no necesariamente es un BitmapDrawable! Puede configurar Drawable en la vista de Imagen.

Además de configurar el Drawable a través de la API de Java, también puede usar la atribución de XML para establecer la fuente Drawable para ImageView. Vea el ejemplo a continuación. Tenga en cuenta que la forma puede ser un archivo de imagen (.png, .jpg, .bmp) o un archivo xml.

+0

Pero, ¿cuál API es más rápida? 'setImageDrawable' parece ser el más rápido, pero ¿qué pasa con los otros? – winklerrr

Cuestiones relacionadas