我刚刚为此写了一篇文章。希望能够回答您的问题。
https://plus.google.com/112740367348600290235/posts/VNAfFLDcKrw
ImageView
有 4 个 API 可以用来指定图像。哪一个应该使用?它们之间有什么区别?
- setImageDrawable(Drawable drawable)
- setImageBitmap(Bitmap bm)
- setImageResource(int resId)
- setImageURI(URI uri)
通过名称,可以知道 ImageView
用于显示图像。但是什么是图像? Bitmap
是一个图像,这不难理解,我们使用 setImageBitmap
来实现。然而,在内部,ImageView
拥有一个 Drawable
而不是 Bitmap
,这就是 setImageDrawable
的作用。当您调用 setImageBitmap
时,内部会首先将位图包装到 BitmapDrawable
中,它是一个 Drawable
,然后再调用 setImageDrawable
。
以下是代码:
public void setImageBitmap(Bitmap bm) {
setImageDrawable(new BitmapDrawable(mContext.getResources(), bm));
}
那么,第三个和第四个API怎么样呢?
您应该已经知道有很多种方法可以创建位图:从文件路径、输入流、Uri或资源文件中创建。
BitmapFactory.decodeFile(String pathName)
BitmapFactory.decodeStream(Inputstream)
BitmapFactory.decodeResource(Resource res, int id)
BitmapFactory.decodeByteArray(byte[] data)
了解这一点后,就容易理解setImageResource
/setImageUri
和setImageBitmap
是完全相同的。
总之,setImageDrawable
是其他API所依赖的原始函数。另外三个函数只是帮助你少写代码的辅助方法。
此外,要牢记的是ImageView
实际上拥有一个Drawable
,它不一定是BitmapDrawable
!您可以将任何Drawable
设置为图像视图。
除了通过Java API设置Drawable
之外,您还可以使用XML属性来设置ImageView
的源Drawable
。请参见下面的示例。请注意,形状可以是图像文件(.png、.jpg、.bmp)或XML文件。