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 Bitmap
BitmapDrawable
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);
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));
}
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.
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?
- setImageDrawable (Drawable drawable)
- setImageBitmap (Bitmap bm)
- setImageResource (int resId)
- 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 Drawable
ImageView
. Voir l'exemple ci-dessous. Notez que la forme peut être soit un fichier image (.png,.jpg,.bmp) ou fichier xml.
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.
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