Android自助餐之大图片加载
原理
- 使用
BitmapFactory.decodeStreeam()
方法,该方法会调用native层代码来创建bitmap(两个重载都会调用) - 使用带
BitmapFactory.Options
参数的方法,改参数可指定生成bitmap的大小
思路
- 根据View尺寸或Window尺寸来确定bitmap的尺寸
- 将确定好的尺寸放入
BitmapFactory.Options
- 调用
BitmapFactory.decodeStreeam()
生成bitmap
步骤
- 根据图片路径或URI打开输入流
InputStream is = getContentResolver().openInputStream(imageUri);
- 获取屏幕或View尺寸
如果能确定View尺寸则使用View尺寸,如果不能(比如动态调整的View、自适应的View等)则获取最接近该View的尺寸,实在不行就获取当前Activity的Window尺寸(比屏幕尺寸小)
- 获取Window尺寸
WindowManager windowManager = getWindowManager();
Display defaultDisplay = windowManager.getDefaultDisplay();
defaultDisplay.getHeight();
defaultDisplay.getWidth();
- 获取View尺寸
view.getMeasuredWidth();
view.getMeasuredHeight();
- 获取Window尺寸
- 根据目标尺寸生成BitmapFactory.Options
BitmapFactory.Options option = new BitmapFactory.Options(); option.inSampleSize = dstSize;
- 使用options调用BitmapFactory.decodeStream()生成bitmap
Bitmap bitmap = BitmapFactory.decodeStream(is, null, option);
完整代码
InputStream is = null;
try {
int screenWidth=getWindowManager().getDefaultDisplay().getWidth();
int screenHeight=getWindowManager().getDefaultDisplay().getHeight();
int maxSize=Math.max(screenWidth,screenHeight);//以长边为准
is = getContentResolver().openInputStream(imageUri);
BitmapFactory.Options option = new BitmapFactory.Options();
option.inSampleSize = maxSize;
Bitmap bitmap = BitmapFactory.decodeStream(is, null, option);
imageView.setImageBitmap(bitmap);
} catch (Exception e) {
e.printStackTrace();
}
try{
if(is!=null)is.close();
}
时间: 2024-10-29 19:08:34