Android中的Bitmap和Drawable有什么区别?

Nik*_*rge 70 android terminology android-drawable android-bitmap

我用谷歌搜索,但我找不到任何文章来描述Android中的Bitmap和Drawable之间的区别.

Ted*_*opp 67

位图是位图图像的表示(类似于java.awt.Image).Drawable是"可以绘制的东西"的抽象.它可以是一个Bitmap(包装为a BitmapDrawable),但它也可以是纯色,其他Drawable对象的集合,或任意数量的其他结构.

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

  • 如果bitmapDrawable包装位图,如果我们在其中的位图上调用recycle()会发生什么?另外,recycle()对API11及以上版本做了什么? (3认同)

Bar*_*ica 37

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

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

  • [Bitmap](http://developer.android.com/reference/android/graphics/Bitmap.html)(`android.graphics.Bitmap`)不是[Drawable]的子类(http://developer.android) .com/reference/android/graphics/drawable/Drawable.html)(`android.graphics.drawable.Drawable`). (10认同)

bit*_*ale 20

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

Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
Run Code Online (Sandbox Code Playgroud)

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

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.your_image);    
Run Code Online (Sandbox Code Playgroud)

位图是像素持有者.Canvas用于在位图上绘制内容(在位图像素上).

关于Drawable的一切都在上面有详细描述.

TL; DR

有些人写道你在Canvas上画画.你不在Canvas上画画.您使用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
Run Code Online (Sandbox Code Playgroud)


Mis*_*oqi 12

可绘制资源

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

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

  • Nine-Patch File,一个PNG具有可伸缩区域的文件,允许基于内容(.9.png)调整图像大小,创建一个NinePatchDrawable.

  • Layer List,一个Drawable管理其他Drawables 数组的A. 这些是按数组顺序绘制的,因此具有最大索引的元素将绘制在顶部,创建一个LayerDrawable.

  • 状态列表,XML为不同状态引用不同位图图形的文件(例如,在按下按钮时使用不同的图像),创建一个StateListDrawable.

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

  • Transition Drawable,一个XML定义Drawable可以在两个Drawable资源之间交叉淡入淡出的文件,创建一个TransitionDrawable.

  • Inset Drawable,一个XML文件,用于定义一个以指定距离对Drawable另一个Drawable进行插入的文件.当View需要背景Drawble小于View的实际边界时,这非常有用.

  • Clip Drawable,一个XML定义基于此当前级别值Drawable剪辑另一个文件的文件,创建一个.DrawableDrawableClipDrawable

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

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

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

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

位图

位图图像.Android支持三种格式的位图文件:.png(首选),.jpg(可接受),.gif(不鼓励).

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

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