android如何加载大图片显示到ImageView

时间: 2015-01-25 10:56 栏目: Android 浏览: 4362 赞: 0 踩: 0 字体:

以下为本篇文章全部内容:

在Android里面添加一张图片到ImageView是很容易的,但是一旦图片超过了机器自身对应用程序的内存设置,那么启动加载图片的时候就会出现内存溢出的情况如下图:

屏幕快照 2015-01-25 上午11.00.01副本.png

屏幕快照 2015-01-25 上午11.00.31副本.png

在图片没有经过任何处理的时候会出现这个错误,程序直接报错退出了。

/*

 * 加载大图到内存并在ImageView中显示

 * 思路:

 * 1、先获取屏幕窗口的大小(宽高)

 * 2、获取图片头信息,对图片进行缩放加载

 * 3、设置图片缩放比例

 * 4、根据缩放比例的条件去解析位图

 * 思路讲解:

 * 1、通过当前当前Activity的getWindowManager方法获取窗口管理器

 * 2、通过窗口管理器的getDefaultDisplay().getWidth()获取窗口的宽度,getDefaultDisplay().getHeight()获取高度(这个方法过时)

 * a、也可以通过实例化一个Point对象,然后通过getDefaultDisplay().getSize(Point outSize)

 * b、outSize.x获取宽度;outSize.y获取高度

 *3、声明一个解析位图的附加条件

 *a、通过BitmapFactory.Options opts = new Options();获取位图附加条件

 *b、opts.inJustDecodeBounds = true;设置整个属性告诉解析器不解析位图只获取头信息

 *4、通过itmapFactory.decodeFile从内存卡加载图片信息

 *a、Bitmap bt = Bitmap decodeFile(String pathName, Options opts);

 *参数1:图片资源

 *参数2:附加条件

 *5、通过附加条件获取图片的宽高

 *a、opts.outWidth获取宽度;opts.outHeight获取高度

 *6、用图片的宽高除以窗口的宽高获取缩放比例

 *7、判断水平方向还是垂直方向

 *a、如果缩放的宽度大于高度那么就是水平方向

 *b、如果缩放的高度大于宽度那么就是垂直方向

 *8、设置附加条件

 *a、opts.inSampleSize = 缩放比例;设置图片按照的缩放比例大小来加载

 *b、opts.inJustDecodeBounds = false;真正解析位图

 *9、加载图片到ImageView

 *a、Bitmap bitmap = BitmapFactory.decodeFile(String pathName, Options opts);用附加条件去加载图片

 *   b、img.setImageBitmap(bitmap);给ImageView设置位图

 * 常用对象与方法:

 *WindowManager窗口管理器

 *获取该对象方法:WindowManager wm = getWindowManager();

 *常用方法:

 *getDefaultDisplay();//获取窗口信息

 *getWidth();//获取屏幕宽度

 *getHeight();//获取屏幕高度

 *BitmapFactory类管理位图对象

 *常用内部类:

 *Options:设置位图到附加条件

 *常用方法:

 *decodeFile(String pathName, Options opts);//获取位图信息

 *参数1:图片资源

 *参数2:解析附加条件

 *BitmapFactory.Options对象,解析位图到附加条件

 *获取该对象方法:BitmapFactory.Options opts = new Options();

 *常用属性:

 *inJustDecodeBounds = boolean;//是否解析位图

 *outWidth;//图片到宽度

 *outHeight;//图片到高度

 *inSampleSize = int;//图片显示的比例

 */

public class MainActivity extends Activity {
	private ImageView img;
    @Override
    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img = (ImageView) findViewById(R.id.img);
        //获取窗口管理器
    	WindowManager wm = getWindowManager();
    	
    	//获取窗口宽高
    	int width = wm.getDefaultDisplay().getWidth();//获取窗口的宽度
    	int height = wm.getDefaultDisplay().getHeight();//获取窗口的高度
    	
    	//获取图片信息
    	BitmapFactory.Options opts = new Options();//解析位图的附加条件
    	opts.inJustDecodeBounds = true;// 不去解析位图,只获取位图头文件信息
    	Bitmap bt = BitmapFactory.decodeFile("/mnt/sdcard/2.jpg", opts);//打开图片获取信息
    	img.setImageBitmap(bt);
    	
    	int btwidth = opts.outWidth;//获取图片的宽度
    	int btheight = opts.outHeight;//获取图片的高度
    	
    	int dx = btwidth/width;//获取水平方向的缩放比例
    	int dy = btheight/height;//获取垂直方向的缩放比例
    	
    	int s = 1;//设置默认缩放比例
    	
    	//如果是水平方向
    	if (dx>dy&&dy>1) {
	    s = dx;
	}
    	
    	//如果是垂直方向
    	if (dy>dx&&dx>1) {
	    s = dy;
	}
    	opts.inSampleSize = s;//设置图片缩放比例
    	opts.inJustDecodeBounds = false;//真正解析位图
    	//把图片的解析条件opts在创建的时候带上
    	Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/2.jpg", opts);
    	img.setImageBitmap(bitmap);//设置图片
    }

}