Glide是一款由Bump Technologies开发的图片加载框架,使得我们可以在android平台上以极度简单的方式加载和展示图片。
使用流程:
1.添加依赖
在app/build.gradle文件当中添加如下依赖:具体版本号可上GitHub查看
dependencies {
compile 'com.github.bumptech.glide:glide:3.7.0'
}
2.AndroidManifest.xml中添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
3.加载网络图片
Glide最基本的使用方式,其实就是关键的三步走:先with(),再load(),最后into()。
关键代码:
Glide.with(this).load(url).into(imageView);
with()方法可以接收Context、Activity或者Fragment类型的参数。也就是说我们选择的范围非常广,不管是在Activity还是Fragment中调用with()方法,都可以直接传this。
在其他地方可以获取ApplicationContext传入with()方法。这决定了Glide加载图片的生命周期。
load()方法,这个方法用于指定待加载的图片资源。Glide支持加载各种各样的图片资源,包括网络图片、本地图片、应用资源、二进制流、Uri对象等等。
因此load()方法也有很多个方法重载 。
3.Glide占位图功能使用(设置未得到图片时的初始照片),缓存禁用
Glide.with(this)
.load(url)
.placeholder(R.mipmap.ic_launcher) //正常占位图
.error(R.drawable.error) //异常占位图(网络等异常导致图片加载失败)
.diskCacheStrategy(DiskCacheStrategy.NONE) //禁止缓存,从而显示占位图
.into(imageView);
4.Glide加载图片格式,Glide支持GIF图片,传入时会自动判断,并正确解析展示。
通过代码也可指定图片格式,指的说的是,指的静态图片为GIF会显示错误图片
Glide.with(this)
.load(url)
.asBitmap()//静态
//.asGif() //gif
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
5.Glide指的图片大小,避免内存浪费(OOM)
.override(100, 100)
查看应用程序最高可用内存(一般默认为16M)
int maxMemory = (int)(Runtime.getRuntime().maxMemory()/1024); Log.d("MainActivity", "max memory : "+maxMemory + "KB");
Android高效加载大图、多图解决方案,有效避免程序OOM
BitmapFactory这个类提供了多个解析方法(decodeByteArray, decodeFile, decodeResource等)用于创建Bitmap对象,我们应该根据
图片的来源选择合适的方法。比如SD卡中的图片可以使用decodeFile方法,网络上的图片可以使用decodeStream方法,资源文件中的图片
可以使用decodeResource方法。这些方法会尝试为已经构建的bitmap分配内存,这时就会很容易导致OOM出现。为此每一种解析方法都提
供了一个可选的BitmapFactory.Options参数,将这个参数的inJustDecodeBounds属性设置为true就可以让解析方法禁止为bitmap分配内
存,返回值也不再是一个Bitmap对象,而是null。虽然Bitmap是null了,但是BitmapFactory.Options的outWidth、outHeight和
outMimeType属性都会被赋值。这个技巧让我们可以在加载图片之前就获取到图片的长宽值和MIME类型,从而根据情况对图片进行压缩。
BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; //禁止分配内存 BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher,options); int height = options.outHeight; //获取图片高 int width = options.outWidth; //获取图片宽 String type = options.outMimeType;
现在图片的大小已经知道了,我们就可以决定是把整张图片加载到内存中还是加载一个压缩版的图片到内存中。以下几个因素是我们需要考虑的:
现在可以对图片进行压缩了,通过设置BitmapFactory.Options中SampleSize的值可以实现。比如设为4,则宽高都/4,大小/16
- 预估一下加载整张图片所需占用的内存。
- 为了加载这一张图片你所愿意提供多少内存。
- 用于展示这张图片的控件的实际大小。
- 当前设备的屏幕尺寸和分辨率。
第一个方法计算出合适的inSampleSize值。
第二个方法首先将BitmapFactory.Options的inJustDecodeBounds属性设置为true,解析一次图片。然后将BitmapFactory.Options连同期望的宽度和高度一起传递到到calculateInSampleSize方法中,就可以得到合适的inSampleSize值了。之后再解析一次图片,使用新获取到的inSampleSize值,并把inJustDecodeBounds设置为false,就可以得到压缩后的图片了。
//计算SampleSize
public static int calculateSampleSize(BitmapFactory.Options options,int reqWidth,int reqHeight){ final int h = options.outHeight; final int w = options.outWidth; int size = 1; if(h > reqHeight || w > reqWidth){ final int hRatio = Math.round((float)h/(float)reqHeight); final int wRatio = Math.round((float)w/(float)reqWidth); size = hRatio<wRatio?hRatio:wRatio; //选择宽和高中最小的比率,保证最终图片宽高一定都会大于目标宽高 } return size; }
调用压缩方法并设置ImageView//改变图片大小 public static Bitmap reduce(Resources res, int resId, int reqWidth, int reqHeight){ final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(res,resId,options); // 调用上面定义的方法计算inSampleSize值 options.inSampleSize = calculateSampleSize(options, reqWidth, reqHeight); // 使用获取到的inSampleSize值再次解析图片 options.inJustDecodeBounds = false; return BitmapFactory.decodeResource(res, resId, options); }
mImageView.setImageBitmap( reduce(getResources(), R.id.myimage, 100, 100));
照片墙应用连接(郭霖)http://blog.csdn.net/guolin_blog/article/details/9526203