setImageBitmap
和setImageDrawable
之间的区别是什么?
我有一个我想从文件动态设置的图像。我遵循的教程说我将Bitmap
转换为BitmapDrawable
,然后使用setImageDrawable
进行设置。我注意到直接用Bitmap
设置setImageBitmap
也有效,但我没有发现任何差异。
Bitmap image = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
BitmapDrawable bitmapDrawable = new BitmapDrawable(image);
imageView.setImageDrawable(bitmapDrawable);
OR
Bitmap image = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
imageView.setImageBitmap(image);
答案 0 :(得分:76)
两个内部setImageBitmap
正在调用setImageDrawable
。
下面的代码是从AOSP的 ImageView.java
中选取的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));
}
答案 1 :(得分:17)
实际上,如果您有时使用null
作为参数,您可能会发现不同之处:
imageView.setImageDrawable(null);
Drawable d = imageView.getDrawable(); // d == null
imageView.setImageBitmap(null);
Drawable d = imageView.getDrawable(); // d == some BitmapDrawable, != null
因此,如果您要检查ImageView
中是否存在可绘制的内容,请注意它。
答案 2 :(得分:11)
我刚刚为此写了一篇文章。希望能够回答你的问题。
https://plus.google.com/112740367348600290235/posts/VNAfFLDcKrw
ImageView
有4个API来指定图像。哪一个使用?有什么区别?
ImageView
,名称,用于显示图像。但是什么是图像? Bitmap
是一张图片,不难理解,我们会为此目的使用setImageBitmap
。但是,在内部,ImageView
有一个Drawable
但不是Bitmap
,而setImageDrawable
就是setImageBitmap
。当您在内部致电BitmapDrawable
时,首先将位图包装到Drawable
,即IS-A setImageDrawable
,然后调用public void setImageBitmap(Bitmap bm) {
setImageDrawable(new BitmapDrawable(mContext.getResources(), bm));
}
。
这是代码。
BitmapFactory.decodeFile(String pathName)
BitmapFactory.decodeStream(Inputstream)
BitmapFactory.decodeResource(Resource res, int id)
BitmapFactory.decodeByteArray(byte[] data)
那么,3和4 API呢?
您应该已经知道这是创建位图的一系列方法:从文件路径,输入流,Uri或资源文件。
setImageResource
意识到这一点,很容易理解setImageUri
/ setImageBitmap
与setImageDrawable
相同。
总而言之,ImageView
是其他API所依赖的原始函数。其他3个只是辅助方法,可以减少代码编写。
此外,请务必注意Drawable
实际上有一个BitmapDrawable
,这不一定是Drawable
!您可以将任何Drawable
设置为图像视图。
除了通过Java API设置Drawable
之外,您还可以使用XML归因来为ImageView
设置源{{1}}。见下面的例子。请注意,形状可以是图像文件(.png,.jpg,.bmp)或xml文件。
答案 3 :(得分:4)
两种方法都有效并达到相同的效果。 在第一种方法中,您将位图包装在一个可绘制对象周围,该对象是可以在视图中绘制的任何内容的抽象。
关于Drawables的特殊之处在于它们允许您对它们所包含的图形对象进行各种操作(缩放,翻译,不透明等)。
位图是一种可绘制的,你可以在这里进一步了解drawable: http://developer.android.com/guide/topics/resources/drawable-resource.html
在第二种方法中,您可以直接访问位图位而无需任何可绘制的相关操作,只需在视图上按原样绘制位图。
希望这有助于,欢呼,Max。
答案 4 :(得分:0)
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));
}
可能与mContext.getResources()不同的是mContext.getResources() 可以获得设备的密度,因此在不同的显示上显示