recycled什么意思 recycle

1.了解Bitmap,BitmapFactory,BitmapFacotry.Options

如题,本来可以直接说着三个东东的关系的,但是我就是要傲娇,就要看代码!

recycled什么意思 recycle

文章插图
如果你打开Bitmap类的源码,你会看到Bitmap的构造方法上有这样一段东东:

recycled什么意思 recycle

文章插图
大概想说的就是:Bitmap的构造方法是私有的,外面不能实例化,只能通过JNI实例化! 当然,肯定也会给我们提供一个接口给我们来创建Bitmap的,而这个接口类就是:BitmapFactory! 来来来,打开BitmapFactory类,我们点下左边的Structure可以看到BitmapFactory给我们 提供了这些方法,大部分都是decodeXxx,通过各种形式来创建Bitmap的!

recycled什么意思 recycle

文章插图
接着我们又发现了,每一种方法,都会有一个Options类型的参数,点进去看看: 于是乎我们发现了这货是一个静态内部类:BitmapFacotry.Options! 而他是用来设置decode时的选项的!

recycled什么意思 recycle

文章插图
我们对这里的某些参数的值进行设置,比如inJustDecodeBounds设置为true避免OOM(内存溢出), 什么,不知道OOM,没事,等下一点点跟你说清楚!最后回到我们的Bitmap!嗯,Bitmap中的 方法比较多,就不一一进行讲解了,我们从中挑几个用得较多的来讲解! 中文文档:Android中文API(136) —— Bitmap
2.Bitmap常用方法
普通方法
  • public boolean compress (Bitmap.CompressFormat format, int quality, OutputStream stream) 将位图的压缩到指定的OutputStream,可以理解成将Bitmap保存到文件中! format:格式,PNG,JPG等; quality:压缩质量,0-100,0表示最低画质压缩,100最大质量(PNG无损,会忽略品质设定) stream:输出流 返回值代表是否成功压缩到指定流!
  • void recycle():回收位图占用的内存空间,把位图标记为Dead
  • boolean isRecycled():判断位图内存是否已释放
  • int getWidth():获取位图的宽度
  • int getHeight():获取位图的高度
  • boolean isMutable():图片是否可修改
  • int getScaledWidth(Canvas canvas):获取指定密度转换后的图像的宽度
  • int getScaledHeight(Canvas canvas):获取指定密度转换后的图像的高度
静态方法:
  • Bitmap createBitmap(Bitmap src):以src为原图生成不可变得新图像
  • Bitmap createScaledBitmap(Bitmap src, int dstWidth,int dstHeight, boolean filter):以src为原图,创建新的图像,指定新图像的高宽以及是否变 。
  • Bitmap createBitmap(int width, int height, Config config):创建指定格式、大小的位图
  • Bitmap createBitmap(Bitmap source, int x, int y, int width, int height)以source为原图,创建新的图片,指定起始坐标以及新图像的高宽 。
  • public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
BitmapFactory.Option可设置参数:
  • boolean inJustDecodeBounds——如果设置为true,不获取图片,不分配内存,但会返回图片的高宽度信息 。
  • int inSampleSize——图片缩放的倍数 。如果设为4,则宽和高都为原来的1/4,则图是原来的1/16 。
  • int outWidth——获取图片的宽度值
  • int outHeight——获取图片的高度值
  • int inDensity——用于位图的像素压缩比
  • int inTargetDensity——用于目标位图的像素压缩比(要生成的位图)
  • boolean inScaled——设置为true时进行图片压缩,从inDensity到inTargetDensity 。
好吧,就贴这么多吧,要用自己查文档~
3.获取Bitmap位图
从资源中获取位图的方式有两种:通过BitmapDrawable或者BitmapFactory,下面演示下: 我们首先得获得这个
BitmapDrawable方法:
你可以创建一个构造一个BitmapDrawable对象,比如通过流构建BitmapDrawable:
BitmapDrawable bmpMeizi = new BitmapDrawable(getAssets().open("pic_meizi.jpg"));
Bitmap mBitmap = bmpMeizi.getBitmap();
img_bg.setImageBitmap(mBitmap);
BitmapFactory方法:
都是静态方法,直接调,可以通过资源ID、路径、文件、数据流等方式来获取位图!
//通过资源ID
private Bitmap getBitmapFromResource(Resources res, int resId) {
return BitmapFactory.decodeResource(res, resId);
}
//文件
private Bitmap getBitmapFromFile(String pathName) {

秒懂生活扩展阅读