在Android开发的过程中,对于图片的加载可以分为两种:本地图片、网络请求图片。对于前者的加载一般的操作为:
imgview.setImageResource(图片地址)
但是对于网络请求过来的图片这种方式处理是不太合理的。那么对于一般的网络请求过来的图片又是怎么样处理的呢?当然,步骤是:通过网络请求----> 图片压缩------>显示图片。
这个过程就必须要提到bitmapFactory这个类,那接下来我们进行学习:
先看一下对应的方法:
对于上面的方法是将获得的图片流、文件、byte[]等放入对应的方法中,然后得到Bitmap对象。然而这样子做对于多图片时候或者图片过大的时候还是会出现OOM 问题,一脸懵逼了吧....那好,就让BitmapFactory.Optens上场了。在BitmapFactory.Optens类中有一个:
Options opts = new Options();
opts.inJustDecodeBounds = true;
这个设置为true 的时候,那么返回的不是一个真正意义上的Bitmap对象而是对应的宽高,这样就不会造成OOM现象了。
可是有的时候,我们觉得这样还不够我们想要的是指定大小的图片显示,那么就下来的就是对于图片的设置:1. 获得屏幕的宽高 2.Bitmap获得网络图片的实际宽高 3. 我们预想的图片显示的宽高。好,知道这些之后调理就清洗了,我们要做的是判断 Bitmap的宽高和我们屏幕的宽高的关系,进行适当的设置比例。
public class ImageSizeUtil
{
/**
* 根据需求的宽和高以及图片实际的宽和高计算SampleSize
*
* @param options
* @param width
* @param height
* @return
*/
public static int caculateInSampleSize(Options options, int reqWidth,
int reqHeight)
{
int width = options.outWidth;
int height = options.outHeight;
int inSampleSize = 1;
if (width > reqWidth || height > reqHeight)
{
int widthRadio = Math.round(width * 1.0f / reqWidth);
int heightRadio = Math.round(height * 1.0f / reqHeight);
inSampleSize = Math.max(widthRadio, heightRadio);
}
return inSampleSize;
}
/**
* 根据ImageView获适当的压缩的宽和高
*
* @param imageView
* @return
*/
public static ImageSize getImageViewSize(ImageView imageView)
{
ImageSize imageSize = new ImageSize();
DisplayMetrics displayMetrics = imageView.getContext().getResources()
.getDisplayMetrics();
LayoutParams lp = imageView.getLayoutParams();
int width = imageView.getWidth();// 获取imageview的实际宽度
if (width <= 0)
{
width = lp.width;// 获取imageview在layout中声明的宽度
}
if (width <= 0)
{
//width = imageView.getMaxWidth();// 检查最大值
width = getImageViewFieldValue(imageView, "mMaxWidth");
}
if (width <= 0)
{
width = displayMetrics.widthPixels;
}
int height = imageView.getHeight();// 获取imageview的实际高度
if (height <= 0)
{
height = lp.height;// 获取imageview在layout中声明的宽度
}
if (height <= 0)
{
height = getImageViewFieldValue(imageView, "mMaxHeight");// 检查最大值
}
if (height <= 0)
{
height = displayMetrics.heightPixels;
}
imageSize.width = width;
imageSize.height = height;
return imageSize;
}
public static class ImageSize
{
int width;
int height;
}
/**
* 通过反射获取imageview的某个属性值
*
* @param object
* @param fieldName
* @return
*/
private static int getImageViewFieldValue(Object object, String fieldName)
{
int value = 0;
try
{
Field field = ImageView.class.getDeclaredField(fieldName);
field.setAccessible(true);
int fieldValue = field.getInt(object);
if (fieldValue > 0 && fieldValue < Integer.MAX_VALUE)
{
value = fieldValue;
}
} catch (Exception e)
{
}
return value;
}
}
好了对于图片的大小在屏幕显示的比例已经获得了,那么接下来进行的是对于多图片的压缩,将要用到ImageLoader进行处理,下一个博客写吧。这里很感谢 鸿洋大神的博客,在他的博客中受益匪浅。