web-dev-qa-db-fra.com

Android - ImageView: setImageBitmap VS setImageDrawable

Quelle est la différence entre setImageBitmap et setImageDrawable?

J'ai une image que je voudrais définir dynamiquement à partir d'un fichier. Le tutoriel que j'ai suivi indique de convertir ma Bitmap en BitmapDrawable, puis de le définir à l'aide de setImageDrawable. J'ai remarqué que régler Bitmap directement avec setImageBitmap fonctionne également, mais je ne remarque 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
meeeee

Il n'y a pas de différence entre les deux appels internes setImageBitmap appelle setImageDrawable.

Le code ci-dessous provient 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));
}
75
nandeesh

En fait, vous verrez peut-être 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 dessinable dans ImageView, méfiez-vous-en.

17
Fenix Voltres

Je viens d'écrire un article à ce sujet. Souhaite pouvoir 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 son nom, est utilisé pour afficher une image. Mais qu'est-ce qu'une image? Bitmap est une image, pas difficile à comprendre et nous utilisons setImageBitmap à cette fin. Cependant, à l’intérieur, ImageView a Drawable mais pas Bitmap et c’est pour cela que setImageDrawable. Lorsque vous appelez setImageBitmap en interne, le bitmap sera d'abord enveloppé à BitmapDrawable, qui est IS-A Drawable, puis appelez setImageDrawable.

Voici le code.

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

Alors, qu'en est-il de l'API 3 et 4?

Vous devez déjà savoir que ce sont des tas de façons de créer un bitmap: à partir d'un chemin de fichier, d'un flux d'entrée, de l'Uri ou 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 identique à setImageBitmap.

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

De plus, il est très important de garder à l’esprit que ImageView a en fait un Drawable, qui ne doit pas nécessairement être un BitmapDrawable! Vous pouvez définir n'importe quel Drawable dans la vue Image.

Outre la définition de l'API Drawable via Java, vous pouvez également utiliser l'attribution XML pour définir la source Drawable pour ImageView. Voir exemple ci-dessous. Notez que la forme peut être un fichier image (.png, .jpg, .bmp) ou un fichier xml.

11
pierrotlefou

Les deux méthodes sont valides et donnent le même résultat . Dans la première méthode, vous enroulez votre image bitmap autour d'un objet pouvant être dessiné, qui est une abstraction de tout ce qui peut être dessiné dans une vue.

La particularité de Drawables est qu’ils vous permettent d’effectuer toutes sortes d’opérations sur l’objet graphique qu’ils enveloppent (mise à l’échelle, conversion, opacité, etc.).

Un bitmap est un type de dessinable, vous pouvez en apprendre plus sur les dessinables ici: http://developer.Android.com/guide/topics/resources/drawable-resource.html

Dans la deuxième méthode, vous accédez directement aux bits bitmap sans aucune opération liée pouvant être dessinée et vous dessinez simplement le bitmap tel quel sur votre vue.

J'espère que cela vous aidera, à la vôtre, Max.

4
Max Raskin
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 mContext.getResources (), de mContext.getResources () peut obtenir la densité du divice, donc l'affichage sur l'écran est différent

0
lemon