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);
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));
}
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.
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?
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.
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.
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