Android-ImageView: setImageBitmap VS setImageDrawable

Quelle est la différence entre setImageBitmap et setImageDrawable?

j'ai une image que je voudrais paramétrer dynamiquement à partir du fichier. Le tutoriel que j'ai suivi dit de convertir mon BitmapBitmapDrawable puis définissez le en utilisant setImageDrawable. J'ai remarquer que la définition de la Bitmap directement setImageBitmap fonctionne aussi mais je ne vois aucune différence.

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

OR

Bitmap image = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
imageView.setImageBitmap(image);
35
demandé sur Vasily Kabunov 2012-08-17 11:45:26

5 réponses

Il n'y a pas de différence entre les deux à l'interne setImageBitmap appelle setImageDrawable.

ci-dessous le code est choisi à partir de ImageView.java of 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));
}
75
répondu nandeesh 2016-10-24 05:02:40

en Fait, vous pouvez voir la différence, si vous utilisez parfois null comme argument:

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

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

donc si vous vérifiez l'existence d'un drawable dans ImageView, méfiez-vous d'elle.

17
répondu Fenix Voltres 2012-12-14 13:51:10

je viens de rédiger un article pour ceci. Souhaitez être en mesure de répondre à votre question.

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

ImageView a 4 API pour spécifier l'image. Lequel utiliser? Quelle est la différence?

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

ImageView par le nom, est utilisé pour afficher une image. Mais qu'est ce qu'une image? Bitmap est-ce pas une image, pas difficile à comprendre, et nous utilisons setImageBitmap pour cette fin. Toutefois, à l'interne, le ImageView a -Drawable mais pas Bitmap et c'est ce que setImageDrawable. Lorsque vous appelez setImageBitmap, intérieurement, d'abord le bitmap sera enveloppé à BitmapDrawable -Drawable, et ensuite appeler setImageDrawable.

Voici le code.

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

Donc, concernant L'API 3 et 4?

vous devez déjà savoir qu'il s'agit de plusieurs façons de créer un bitmap: à partir d'un chemin de fichier, à partir d'un flux d'entrée, à partir de L'Uri, ou à partir du fichier de ressources.

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

Conscient de cela, il est facile de comprendre setImageResource/setImageUri est juste comme setImageBitmap.

Pour résumer, setImageDrawable est la fonction primitive sur laquelle reposent les autres API. Les 3 autres sont des méthodes d'aide qui vous permettent d'écrire moins de code.

En outre, il est très important de garder à l'esprit que ImageView en fait, a-a Drawable, qui ne doit pas nécessairement être un BitmapDrawable! Vous pouvez définir tout Drawable à la vue D'Image.

Outre Drawable grâce à L'API Java, vous pouvez également utiliser XML attribution pour définir la source DrawableImageView. Voir l'exemple ci-dessous. Notez que la forme peut être soit un fichier image (.png,.jpg,.bmp) ou fichier xml.

11
répondu pierrotlefou 2017-01-24 14:40:48

les deux méthodes sont valides et atteignent le même résultat. Dans la première méthode, vous enveloppez votre bitmap autour d'un objet dessinable qui est une abstraction pour tout ce qui peut être dessiné dans une vue.

la particularité des Drawables est qu'ils permettent toutes sortes d'opérations sur l'objet graphique qu'ils enveloppent (mise à l'échelle, traduction, opacité, etc.)..).

un bitmap est une sorte de drawable, vous pouvez en savoir plus sur les drawables ici: http://developer.android.com/guide/topics/resources/drawable-resource.html

dans la seconde méthode, vous accédez directement aux bits bitmap sans aucune opération liée à l'image et vous n'avez qu'à dessiner le bitmap as-is sur votre vue.

espérons que cela aide, santé, Max.

4
répondu Max Raskin 2012-08-17 07:54:48
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));
}

peut-être que la différence est le contexte.getResources(), à partir de mContext.getResources() peut obtenir la densité du divice, de sorte que l'affichage sur sceen est différent

0
répondu lemon 2013-03-11 06:58:34