【1】问题加在过大的图片,内存分配给的不够就会报错
10-16 02:11:10.443: I/dalvikvm-heap(22693): Forcing collection of SoftReferences for 30720012-byte allocation
加载大图的时候内存溢出。
【2】获取手机的分辨率。
A,过时的API
[2]获取手机的分辨率
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
int width = wm.getDefaultDisplay().getWidth();
int height = wm.getDefaultDisplay().getHeight();
B,新的API(没有下划线)
Point point = new Point();
wm.getDefaultDisplay().getSize(point);
int width = point.x;
int height = point.y;
System.out.println("手机的分辨率:"+width+"~~~~"+height);
【3】 把图片放在SD卡中。
注意opts.inJustDecodeBounds = true;方法,设为true时不是真的解析位图。
图片大小 2400 * 3200 宽高都除以100 240 和320
手机大小:320 * 480
计算缩放比:7 6 按照大的去缩放.
所以需要我们动态的获取手机的分辨率和图片的分辨率 在算出缩放比
// 点击按钮加载大图片(小狗图片)
@SuppressLint("SdCardPath")
public void click(View v) {
//[0]创建位图工厂配置参数
BitmapFactory.Options opts = new Options();
//[0.1]不去真正的解析位图 返回一个null(no bitmap) 但是还可以获取图片的宽高信息
opts.inJustDecodeBounds = true;
// [1]把小狗的图片变成bitmap
BitmapFactory.decodeFile("/mnt/sdcard/dog.jpg",opts);
//[2]获取图片的宽高信息
int imgWidth = opts.outWidth;
int imgHeight = opts.outHeight;
System.out.println("图片的宽高:"+imgWidth+"~~~"+imgHeight);
//[3]算出缩放比 图片的高/手机高 图片的宽/手机的宽 按照大的去缩放
int scale = 1; //代表缩放比
int scaleX = imgWidth / width;
int scaleY = imgHeight / height;
if (scaleX >= scaleY && scaleX > scale) {
scale = scaleX;
}else if(scaleY > scaleX && scaleY > scale){
scale = scaleY;
}
System.out.println("缩放比:"+scale);
//[4]按照缩放比加载图片
opts.inSampleSize = scale;
//[5]按照这个缩放比解析位图
opts.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/dog.jpg",opts);
// [6]把bitmap(位图)展示到iv上
iv.setImageBitmap(bitmap);
}