相信参加工作几年的小伙伴,在工作闲暇之时,总想找点东西看看,一方面可能是为了弥补自己的知识短板,另一方面可能是为了扩大知识领域,进阶为资深或高级开发者。本人也是这样,今天在看李赞红老师的 Android 自定义组件开发详解pdf 中,看到了Bitmap 类和 BitmapDrawable 类 的介绍,特此记录下,方便日后查阅。
学习一个东西,无非就是了解它是什么,怎么用,有什么好处,带着这样的疑问,咱们一起来看看
一、Bitmap 类
Bitmap 官译为 位图,主要用于存储 png,jpg,gif 等格式的图片数据,在Android开发中针对图片的处理,说白了就是对Bitmap对象进行操作,那么怎么将一张图片转为Bitmap呢?
Android中对图片进行处理,需要先将图片读入 Bitmap 对象,接着调用相关的 API 对图片进行处理和加工,图片读取操作是由 BitmapFactory 类完成的,该类定义了若干方法用于读取图片数据:
1、public static Bitmap decodeStream(InputStream is)
从输入流中读取图片数据并转换成 Bitmap 对象
2、 public static Bitmap decodeByteArray(byte[] data, int offset, int length)
从字节数组中读取图片数据并转换成 Bitmap 对象
3、 public static Bitmap decodeResource(Resources res, int id)
从 Android 的 drawable 资源(res/drawable)目录中读取图片数据并转换成 Bitmap 对象
4、 public static Bitmap decodeFile(String pathName)
从图片文件中读取图片数据并转换成 Bitmap 对象
二、Bitmap 如何创建一张空白图片
Bitmap简单创建一张图片,只需指定宽度、高度和存储格式(ARGB_4444、ARGB_8888、ALPHA_8)等信息,最简单的方法是 public static Bitmap createBitmap(int width, int height, Config config),该方法是 static 方法,不需要创建 Bitmap 对象即可直接调用。
Bitmap bmp = Bitmap.createBitmap(400,400,Config.ARGB_8888);
特别注意的是
位于 res/drawable 目录下的图片读成 Bitmap 对象后是无法修改的,若要修改必须复制一张新的图片并设置可修改标记,Bitmap 类的 copy()方法能完成该功能,方法签名如下:public Bitmap copy(Config config, boolean isMutable)
参数 isMutable 为 true 表示复制的新位图可以修改
三、Bitmap 回收
Bitmap 是一种非常占用资源的对象,不管是什么手机,如果没有处理好很容易导致 App 崩溃,所以,及时回收 Bitmap 内存是一个好习惯,涉及到的方法有两个:
1、 public final boolean isRecycled()
判断是否已回收,返回 true 表示内存已被回收
2、 public void recycle()
回收 Bitmap 内存,同一个 Bitmap 对象不能连续回收多次,所以在回收之前最好是判断。不过从源码中发现其实该方法已经自己判断过了。常见的回收 Bitmap 资源的代码形如(bmp 为 Bitmap 对象):
if(bmp!= null&&!bmp.isRecycled()){
bmp.recycle();
System.gc();//ᨀ醒 JVM 释放资源
bmp = null;
}
四、BimapDrawable与 Bitmap区别
BimapDrawable 是 Android 的一种通用位图格式,我们可以简单粗暴地理解成 Bitmap 的另外一种表现形式。但是和 Bitmap 相比 BimapDrawable 占用资源更少、性能更高。
Bitmap 和 BitmapDrawable 在一些情况下需要相互转换,BitmapDrawable 的构造方法 public BitmapDrawable(Resources res, Bitmap bitmap)用于将Bitmap转换成BitmapDrawable,而getBitmap()方法则用于将 BitmapDrawable 转换成 Bitmap。
Bitmap 和 BitmapDrawable 都能获得位图的宽度和高度,对比如下:
Bitmap
int getWidth() int getIntrinsicWidth()
BitmapDrawable
int getHeight() int getIntrinsicHeight()