42

setImageBitmap和 和有什么不一样setImageDrawable

我有一个我想从文件中动态设置的图像。我遵循的教程说将我转换Bitmap为 aBitmapDrawable然后使用setImageDrawable. 我注意到Bitmap直接设置 withsetImageBitmap也可以,但我没有发现任何区别。

Bitmap image = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
BitmapDrawable bitmapDrawable = new BitmapDrawable(image);
imageView.setImageDrawable(bitmapDrawable);

或者

Bitmap image = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
imageView.setImageBitmap(image);
4

5 回答 5

80

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));
}
于 2012-08-17T07:48:03.747 回答
18

实际上,如果您有时将null其用作参数,您可能会看到差异:

imageView.setImageDrawable(null);
Drawable d = imageView.getDrawable(); // d == null

imageView.setImageBitmap(null);
Drawable d = imageView.getDrawable(); // d == some BitmapDrawable, != null

因此,如果您正在检查是否存在可绘制的 in ImageView,请注意它。

于 2012-12-14T13:51:10.983 回答
13

我刚刚为此写了一篇文章。希望能够回答你的问题。

https://plus.google.com/112740367348600290235/posts/VNAfFLDcKrw

ImageView有 4 个 API 来指定图像。使用哪一个?有什么不同?

  1. setImageDrawable(Drawable drawable)
  2. setImageBitmap(位图 bm)
  3. setImageResource(int resId)
  4. setImageURI(URI URI)

ImageView,顾名思义,用于显示图像。但什么是图像?一个Bitmap是图像,不难理解,我们setImageBitmap为此目的使用。但是,在内部,ImageViewhas-aDrawable但不是 a Bitmap,这就是为什么setImageDrawable。当您在setImageBitmap内部调用 时,首先将位图包装到BitmapDrawableIS-A Drawable,然后调用setImageDrawable.

这是代码。

public void setImageBitmap(Bitmap bm) {
    setImageDrawable(new BitmapDrawable(mContext.getResources(), bm));
}

那么,3 和 4 API 呢?

您应该已经知道创建位图的方法有很多种:从文件路径、从输入流、从 Uri 或从资源文件。

BitmapFactory.decodeFile(String pathName)
BitmapFactory.decodeStream(Inputstream)
BitmapFactory.decodeResource(Resource res, int id)
BitmapFactory.decodeByteArray(byte[] data)

意识到这一点,很容易理解setImageResource/setImageUrisetImageBitmap.

综上所述,setImageDrawable是其他 API 所依赖的原始函数。其他 3 个只是帮助您编写更少代码的方法。

此外,请务必记住,ImageView实际上 has-aDrawable不一定是 a BitmapDrawable!您可以将任何设置Drawable为图像视图。

除了Drawable通过 Java API 设置之外,您还可以使用 XML 属性来Drawable设置ImageView. 请参见下面的示例。请注意,该形状可以是图像文件(.png、.jpg、.bmp)或 xml 文件。

于 2013-09-09T08:39:20.667 回答
4

这两种方法都是有效的,并且达到了相同的结果。在第一种方法中,您将位图包装在一个可绘制对象周围,该对象是可以在视图中绘制的任何内容的抽象。

Drawables 的特别之处在于,它们让您可以对它们包裹的图形对象进行各种操作(缩放、平移、不透明度等)。

位图是一种可绘制对象,您可以在此处进一步了解可绘制对象:http: //developer.android.com/guide/topics/resources/drawable-resource.html

在第二种方法中,您无需任何可绘制相关操作即可直接访问位图位,只需在视图上按原样绘制位图。

希望这会有所帮助,干杯,马克斯。

于 2012-08-17T07:54:48.440 回答
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()可以得到divice的密度,所以sceen上的显示不一样

于 2013-03-11T06:58:34.057 回答