Android 应用中显示的图片不仅包括*.png、*.jpg、*.gif格式的位图,还包括使用xml资源文件定义的各种Drawable对象。
对于Drawable对象只要我们添加了图片资源,Android SDK会自动为其在R清单文件中添加一个Id,用户可以通过该id拿到对应的Drawable对象。Drawable对象的形成还可以是我们自定义的xml文件(例如 shape selector等xml文件)
对于Bitmap,其代表的是一个位图,我们可以将资源文件中图片加载为一个Bitmap对象,也可以将文件中的图片加载为一个Bitmap对象,每次加载Bitmap对象都是系统解析、创建Bitmap对象。由于手机内存比较小,不断的解析、创建Bitmap可能由于前面的内存还没有回收,而导致程序运行时引发OutOfMemory(OOM)内存溢出,导致程序崩溃。
Drawable
Drawable对象可以通过Resourse 类的getDrawable(int id)获取,Drawable可用于显示为图片或背景图,或图片修饰等。
Bitmap和BitmapFactory
1、Bitmap和BitmapDrawable关系
我们可以把一个Bitmap对象包装成BitmapDrawable对象,通过BitmapDrawable的构造器
BitmapDrawable drawable=new BitmapDraw(bitmap);
若希望获取BitmapDrawable所包装的Bitmap对象可以调用BitampDrawabled getBitmap()方法。
2、Bitmap的方法,这些方法是Bitmap对象的获取和修改大小等的实现
(1)createBitmap(Bitmap sourse,int x,int y,int width,int height);将源位图的坐标(x,y)开始,从位图中挖去宽width,高height的一块出来,创建新的Bitmap对象。
(2)createScaledBitmap(Bitmap src,int dstWidth,int dstHeight,boolean filter);对源位图进行缩放,缩放成宽DSTWidth,高dstHeight的新位图。
(3)createBitmap(int width,int height,Bitmap.Config config);创建一个宽高width height的新位图
(4)createBitmap(Bitmap sourse,int x,int y,int width,int height,Matrix m,boolean filter);从源位图的指定坐标开始,从中挖取宽高的一块出来,创建新的Bitmap对象,并按照Matrix指定的规则变化
3、BitmapFactory加载Bitmap对象
(1)decodeByteArray(byte[] data,int offset,int length);从指定字节数组的offse开始将长度为length的字节数据解析成Bitmap对象
(2)decodeFile(String pathName);从PathName指定文件中解析创建Bitmap对象。
(3)decodeResourse(Resourse res,int id);根据资源id将指定资源解析创建Bitmap对象。
(4)decodeStream(InputStream is);用于从输入流中解析创建Bitmap对象。
4、对于多次解析创建Bitmap造成的OOM,我们可以释放无用的Bitmap资源来减少内存的占用。
(1)boolean isRecycled();返回Bitmap对象是否已被回收。
(2)void recycle();强制Bitmap对象回收自己。