Android - ImageView:setImageBitmap VS setImageDrawable

mee*_*eee 37 android imageview android-bitmap

setImageBitmap和之间有什么区别setImageDrawable

我有一个图像,我想从文件动态设置.我遵循的教程说将我转换Bitmap为a BitmapDrawable然后使用它进行设置setImageDrawable.我注意到Bitmap直接设置setImageBitmap也有效,但我没有发现任何差异.

Bitmap image = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
BitmapDrawable bitmapDrawable = new BitmapDrawable(image);
imageView.setImageDrawable(bitmapDrawable);
Run Code Online (Sandbox Code Playgroud)

要么

Bitmap image = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
imageView.setImageBitmap(image);
Run Code Online (Sandbox Code Playgroud)

nan*_*esh 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));
}
Run Code Online (Sandbox Code Playgroud)

  • +1用于查看Android源代码.开源软件的好处之一. (21认同)
  • 我不同意这样的结论.有一点不同:例如,如果要优化带有图像的列表视图,最好创建UI线程的Drawable外部并将其分配给UI线程中的每个imageview.如果您使用Bitmap,那么Drawable的创建将减慢UI线程,并且列表将不会快速和平滑地滚动. (16认同)
  • 区别在于新的BitmapDrawable(Resource,Bitmap)和不推荐使用的构造函数new BitmapDrawable(Bitmap).如果您使用已弃用的布局问题,则可能会发生布局问题. (2认同)

Fen*_*res 17

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

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

imageView.setImageBitmap(null);
Drawable d = imageView.getDrawable(); // d == some BitmapDrawable, != null
Run Code Online (Sandbox Code Playgroud)

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


pie*_*fou 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)

ImageView,名称,用于显示图像.但是什么是图像?A Bitmap是一个图像,不难理解,我们setImageBitmap用于此目的.但是,在内部,ImageView有一个Drawable但不是一个Bitmap,那就是setImageDrawable为了什么.在setImageBitmap内部调用时,首先将位图包装到BitmapDrawableIS-A Drawable,然后调用setImageDrawable.

这是代码.

public void setImageBitmap(Bitmap bm) {
    setImageDrawable(new BitmapDrawable(mContext.getResources(), bm));
}
Run Code Online (Sandbox Code Playgroud)

那么,3和4 API怎么样?

您应该已经知道这是创建位图的一系列方法:来自文件路径,来自输入流,来自Uri或来自资源文件.

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

意识到这一点,很容易理解setImageResource/ setImageUri同样如此setImageBitmap.

总而言之,setImageDrawable是其他API所依赖的原始功能.其他3个只是帮助方法,使您编写更少的代码.

另外,要记住ImageView实际上有一个非常重要Drawable,不一定是一个BitmapDrawable!您可以将任何设置设置Drawable为图像视图.

除了设置了Drawable通过Java API,你也可以使用XML属性设置源DrawableImageView.见下面的例子.请注意,形状可以是图像文件(.png,.jpg,.bmp)或xml文件.