Reputation: 2939
What is the difference between setImageBitmap
and setImageDrawable
?
I have an image which I would like to set dynamically from file. The tutorial that I followed says to convert my Bitmap
to a BitmapDrawable
then set it using setImageDrawable
. I've notice that setting the Bitmap
directly with setImageBitmap
also works but I don't notice any difference.
Bitmap image = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
BitmapDrawable bitmapDrawable = new BitmapDrawable(image);
imageView.setImageDrawable(bitmapDrawable);
OR
Bitmap image = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
imageView.setImageBitmap(image);
Upvotes: 42
Views: 75577
Reputation: 40821
I just wrote up an article for this. Wish to be able to answer your question.
https://plus.google.com/112740367348600290235/posts/VNAfFLDcKrw
ImageView
has 4 APIs to specify the image. Which one to use? What is the difference?
ImageView
, by the name, is used to display an image. But what is a image? A Bitmap
is-a image, not hard to understand and we use setImageBitmap
for that purpose. However, internally, the ImageView
has-a Drawable
but not a Bitmap
and that is what setImageDrawable
for. When you call setImageBitmap
, internally, first the bitmap will be wrapped to BitmapDrawable
, which IS-A Drawable
, and then call setImageDrawable
.
Here is the code.
public void setImageBitmap(Bitmap bm) {
setImageDrawable(new BitmapDrawable(mContext.getResources(), bm));
}
So, what about the 3 and 4 API?
You should already know that that are bunches of ways to create a bitmap: from a file path, from an input stream, from the Uri, or from the resource file.
BitmapFactory.decodeFile(String pathName)
BitmapFactory.decodeStream(Inputstream)
BitmapFactory.decodeResource(Resource res, int id)
BitmapFactory.decodeByteArray(byte[] data)
Aware of this, it is easy to understand setImageResource
/setImageUri
is just same as setImageBitmap
.
To sum up, setImageDrawable
is the primitive function other APIs rely on. The other 3 are just helper methods making you write less code.
In addition, it is very important to keep in mind that ImageView
actually has-a Drawable
, which not necessarily to be a BitmapDrawable
! You could set any Drawable
to the Image view.
Besides setting the Drawable
through Java API, you could also using XML attribution to set the source Drawable
for ImageView
. See example below. Note that the shape could be either an image file (.png, .jpg, .bmp) or xml file.
Upvotes: 14
Reputation: 24820
There is no difference between the two internally setImageBitmap
is calling setImageDrawable
.
Below code is picked from 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));
}
Upvotes: 81
Reputation: 7
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));
}
maybe the difference is the mContext.getResources(), from mContext.getResources() can get the density of the divice, so the display on sceen is different
Upvotes: 0
Reputation: 3448
Actually, you may see the difference, if you sometimes use null
as an argument:
imageView.setImageDrawable(null);
Drawable d = imageView.getDrawable(); // d == null
imageView.setImageBitmap(null);
Drawable d = imageView.getDrawable(); // d == some BitmapDrawable, != null
so if you are checking for existence of a drawable in ImageView
, beware of it.
Upvotes: 18
Reputation: 1052
Both methods are valid and achieve the same result. In the first method you wrap your bitmap around a drawable object which is an abstraction for anything that can be drawn in a View.
The special thing about Drawables is that they let you do all kinds of operations on the graphical object they wrap around (scaling, translation, opacity etc..).
A bitmap is one kind of drawable, you can learn further about drawables here: http://developer.android.com/guide/topics/resources/drawable-resource.html
In the second method, you directly access the bitmap bits without any drawable related operations and simply draw the bitmap as-is on your view.
Hope this helps, cheers, Max.
Upvotes: 4