Android - ImageView:setImageBitmap VS setImageDrawable

时间:2012-08-17 07:45:26

标签: android imageview android-bitmap

setImageBitmapsetImageDrawable之间的区别是什么?

我有一个我想从文件动态设置的图像。我遵循的教程说我将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);

5 个答案:

答案 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来指定图像。哪一个使用?有什么区别?

  1. setImageDrawable(Drawable drawable)
  2. setImageBitmap(Bitmap bm)
  3. setImageResource(int resId)
  4. setImageURI(URI uri)
  5. 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 / setImageBitmapsetImageDrawable相同。

    总而言之,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() 可以获得设备的密度,因此在不同的显示上显示