以下为本篇文章全部内容:
在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
总踩数量:128087
文章数量:29