Android中的位图和Drawable有什么区别?


Answers:


73

位图是位图图像的表示形式(类似于java.awt.Image)。Drawable是“可以绘制的东西”的抽象。它可以是位图(用包裹起来BitmapDrawable),但也可以是纯色,其他Drawable对象的集合或任意数量的其他结构。

大多数Android UI框架喜欢使用Drawable对象,而不是Bitmap对象。视图可以接受任何Drawable作为背景。ImageView可以显示前景Drawable。存储为资源的图像将作为Drawable对象加载。


3
如果bitmapDrawable包装了一个位图,如果我们在其中的位图上调用recycle()会发生什么?另外,对于API11及更高版本,recycle()有什么作用?
android开发人员

@androiddeveloper-我不确定,但这不会有什么好处。一旦位图被BitmapDrawable包装,可绘制对象将“拥有”该位图,并应管理其寿命。如果您致电recycle(),您正在干扰这种关系。充其量,绘图对象什么都不会画。更有可能在以后引发某种异常。根据文档recycle()使用API​​11 +可以做的事情与往常一样:它允许您在知道原生像素后就释放它们。
特德·霍普

他们说在那里释放了位图的本机内存,但是我们知道,从API 11开始,与位图有关的所有内容(包括其原始数据)都在堆内部,因此回收似乎是一件很奇怪的事情……
android开发人员

@androiddeveloper-从源代码上看,似乎仍然有一个本机位图。出于性能目的,原始缓冲区公开为公共成员(尽管仍对公共API隐藏)。调用recycle()仍将释放本机位图。还将成员缓冲区设置为null
泰德·霍普

是的,我也读过它,但没有意义,因为他们在Google IO上说,位图不再存储在本机内存中。我真的很困惑。
Android开发人员

39

可绘制是可以绘制的东西。例如布局,矢量图像(线,圆),字体,图像等

位图-是Drawable的特定类型,它是图像,例如:PNG,JPEG等


10
位图android.graphics.Bitmap)不是的一个子类可绘制android.graphics.drawable.Drawable)。
特德·霍普

当然,这是我的错。我的意思是BitmapDrawable
Barmaley,2012年

但是他们说位图:最简单的Drawable,PNG或JPEG图像。在文档中。
mallaudin

1
我以为我是从此链接粘贴的。developer.android.com/guide/topics/resources/...
mallaudin

32

位图不是图像。位图是位图(注释名称:位图)。此地图代表您可以在上面绘制内容的像素。它可能是您自己的自定义位图(不是图像),例如square:

Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);

或者您可以从图像创建位图对象:

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.your_image);    

位图是像素持有者。Canvas用于在位图上绘制某些东西(以位图像素为单位)。

上面已经很好地描述了有关Drawable的所有内容。

TL; DR

有人写道您在画布上绘画。您不使用画布。您可以使用Canvas辅助方法绘制位图像素。

Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.drawColor(Color.RED) // now all bitmap pixels became red

不错的答案值得+1 :)感谢代码行的解释。
HarshitMadhav '18年

完美的解释
Tushar Srivastava

14

可绘制资源

一个Drawable资源是可以被绘制到屏幕上,哪些是你可以用API,如检索图形的一般概念getDrawable(int)或应用到另一个XML资源与属性,如android:drawableandroid:icon。有几种不同类型的可绘制对象:

  • 位图文件(位图图形文件,.png,.jpg或.gif)创建一个BitmapDrawable

  • Nine-Patch File是一个PNG具有可拉伸区域的文件,该文件可根据内容(.9.png)调整图像大小,并创建了一个NinePatchDrawable

  • 层列表Drawable管理其他Drawables的数组。它们按数组顺序绘制,因此索引最大的元素被绘制在顶部,创建一个LayerDrawable

  • 状态列表State List)是一个XML文件,该文件引用不同的位图图形以表示不同的状态(例如,当按下按钮时使用不同的图像)StateListDrawable

  • 级别列表,一个XML定义a的文件,该文件Drawable管理多个Drawables,每个s分配有一个最大值,该文件创建一个LevelListDrawable

  • Transition DrawableXML定义Drawable可在两个Drawable资源之间淡入淡出的的文件)会创建一个TransitionDrawable

  • Inset Drawable,一个XML文件的定义,该文件以指定的距离Drawable插入另一个文件Drawable。当aView需要的背景Drawble尺寸小于View的实际范围时,这很有用。

  • 剪辑绘制对象,一个XML定义文件Drawable是剪辑另一个Drawable在此基础上Drawable的电流电平值,创建一个ClipDrawable

  • Scale Drawable,一个XML定义的文件,该文件根据其当前级别值Drawable更改另一个尺寸Drawable,创建一个ScaleDrawable

  • Shape Drawable,一个XML定义几何形状(包括颜色和渐变)的文件,会创建一个ShapeDrawable

另请参阅动画资源文档,以了解如何创建AnimationDrawable

注意:颜色资源也可以用作Ddrawablein XML。例如,创建时StateListDrawable,您可以为android:drawable属性(android:drawable="@color/green")引用颜色资源。

位图

位图图像。Android支持以下三种格式的位图文件:.png(首选)、. jpg(可接受)、. gif(不推荐使用)。

您可以使用文件名作为资源ID直接引用位图文件,或在XML中创建别名资源ID。

注意:在构建过程中,可以通过aapt工具使用无损图像压缩自动优化位图文件。例如,不需要多于256种颜色的真彩色PNG可以转换为带有调色板的8位PNG。这将导致图像质量相同,但需要较少的内存。因此请注意,在构建过程中,放置在此目录中的图像二进制文件可能会更改。如果打算将图像作为位流读取以将其转换为位图,则将图像放在res/raw/不会进行优化的文件夹中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.