图片过大会直接导致内存溢出,所以一般加载之前要先处理一下。
1.通过窗体管理器WindowManager得到屏幕的宽高信息
2.通过图片头文件信息Options得到图片的宽高。
3.计算缩放比例
4.缩放加载真实图片Bitmap到内存
package com.itheima.loadimg;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.BitmapFactory.Options;import android.os.Bundle;import android.view.View;import android.view.WindowManager;import android.widget.ImageView;public class MainActivity extends Activity { private ImageView iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = (ImageView) findViewById(R.id.iv); } public void click(View view){ //相当消耗内存资源 根据图片的分辨率而定 //不能直接加载图片,要对图片进行缩放 //手机屏幕本来就小,不需要大像素的的图片,所以可以直接缩放 // Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/photo.jpg"); // iv.setImageBitmap(bitmap); //1.通过窗体管理器得到屏幕的宽高信息 WindowManager wm = getWindowManager(); //虽然这个方法过时了,但是还是用这个,新的方法在新版本才有,不能兼容2.3 int screenWidth = wm.getDefaultDisplay().getWidth(); int screenHeight = wm.getDefaultDisplay().getHeight(); System.out.println("屏幕宽高:"+screenWidth+"-"+screenHeight); //2.得到图片的宽高。 //这里不像上面那样加载图片,防止奔溃 //只加载头文件信息(就是鼠标移动到图片显示出来的信息),api和上面的是不一样的 BitmapFactory.Options opts = new Options();//解析位图的附加条件 opts.inJustDecodeBounds = true;//不去解析真实的位图,只是获取这个位图的头文件信息 Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/photo.jpg", opts); int bitmapWidth = opts.outWidth; int bitmapHeight = opts.outHeight; System.out.println("图片宽高: "+bitmapWidth+"-"+bitmapHeight); //3.计算缩放比例 int dx = bitmapWidth/screenWidth; int dy = bitmapHeight/screenHeight; int scale = 1; //dy>1 是在指明图片像素比手机屏幕还小的情况下就不能缩比例了 if(dx>dy&&dy>1){ System.out.println("按照水平方法缩放,缩放比例:"+dx); scale = dx; } if(dy>dx&&dx>1){ System.out.println("按照垂直方法缩放,缩放比例:"+dy); scale = dy; } //4.缩放加载图片到内存。 opts.inSampleSize = scale; opts.inJustDecodeBounds = false;//真正的去解析这个位图。 bitmap = BitmapFactory.decodeFile("/mnt/sdcard/photo.jpg", opts); iv.setImageBitmap(bitmap); }}