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?
- setImageDrawable(Drawable drawable)
- setImageBitmap(Bitmap bm)
- setImageResource(int resId)
- setImageURI(URI uri)
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.