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


在图片没有经过任何处理的时候会出现这个错误,程序直接报错退出了。
/*
* 加载大图到内存并在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);//设置图片
}
}
总赞数量:18274
总踩数量:128088
文章数量:29