Android框架源码分析——Glide详解(基础篇)

一、概述

对于每个安卓程序猿来说,图片的加载是最常见问题,不管是简单的单一图片还是炫酷的gif图片,大家都应注意的问题OOM,当然对于有点经验的人来说,在开发阶段就会注意这个问题了,解决措施也很简单,利用缓存策略LruCache和DisLruCash,在内存不足时清除缓存,当然这个方法需要自己去写一些ImageLoader,现在没人回自己去写这个了,因为有大神的杰作,就是本文的主人公Glide;

二、Glide的导入

这里的导入只针对AS的使用,一些还抱着Eclipse的同学,慢慢改变使用AS吧,你会发现真的很方便也很智能:

dependencies {
  compile 'com.github.bumptech.glide:glide:3.7.0'
}

三、使用

Glide的使用也很简单,一句话搞定,当你第一次使用的时候,肯定对大神万分膜拜啊:

Glide.with(context).load("http://p2.so.qhimgs1.com/sdr/512_768_/t01a07586d3eec4218e.jpg").into(imageView);

先看一下Glide.With(),这里传入一个上下文对象,有没有想过为什么要传入呢?了解过源码的同学可能知道这里可以穿入三种对象,根据传入对象的生命周期,会去在合适的时机加载或销毁图片:

RequestManager with(Context context)
RequestManager with(Activity activity)
RequestManager with(FragmentActivity activity)

看一下load()的方法,可以传入不同的参数类型:

DrawableTypeRequest<String> load(String string)
DrawableTypeRequest<Uri> load(Uri uri)
DrawableTypeRequest<File> load(File file)
DrawableTypeRequest<Integer> load(Integer resourceId)
DrawableTypeRequest<URL> load(URL url)

简单实用一下,具体读者自家尝试:

  • 资源加载
 int  resourceId=R.mipmap.image;
 Glide.with(context).load(resourceId).into(imageView);
  • 文件加载
File file = new File(Environment.getExternalStorageDirectory() + File.separator +  "image", "image.jpg");
Glide.with(this).load(file).into(imageView);

占位

大家都知道在加载图片的时候会出现各种问题,这也导致了图片加载会不会成功,那么当图片不成功时,Glide提供两种方法,其一就是占位placeholder:

Glide.with(context).load("http://p2.so.qhimgs1.com/sdr/512_768_/t01a07586d3eec4218e.jpg").placeholder(R.mipmap.place).into(imageView);

另一个就是 error

Glide.with(context).load("http://p2.so.qhimgs1.com/sdr/512_768_/t01a07586d3eec4218e.jpg").error(R.mipmap.error).into(imageView);

这两个方法都是见闻知意不做解释,那么这两个方法在什么地方调用?又如何调用呢?我们知道这种掉用方式肯定是有监听器,监听执行的,Glide提供了listener的接受对象RequestListener:

   //设置错误监听
         RequestListener errorListener=new RequestListener() {
            @Override
            public boolean onException(Exception e, String model, Target target, boolean isFirstResource) {

                Log.e("onException",e.toString()+"  model:"+model+" isFirstResource: "+isFirstResource);
                imageView.setImageResource(R.mipmap.ic_launcher);
                return false;
            }

            @Override
            public boolean onResourceReady(GlideDrawable resource, String model, Target target, boolean isFromMemoryCache, boolean isFirstResource) {
                Log.e("onResourceReady","isFromMemoryCache:"+isFromMemoryCache+"  model:"+model+" isFirstResource: "+isFirstResource);
                return false;
            }
        } ;

我们看到有两个回调方法,通过onException是图片加载异常回调,onResourceReady是加载成功的回调,具体的读者可以自行打印log查看;

crossFade

Glide提供了渐入渐出的动画效果的动画效果:

Glide.with(context).load("http://p2.so.qhimgs1.com/sdr/512_768_/t01a07586d3eec4218e.jpg").error(R.mipmap.error).placeholder(R.mipmap.place).crossFade(2000).into(imageView);

crossFade内部提供一个int类型的数据,作为这个动画执行的周期时间,当然也可以不填,选择默认的时间,既然可以添加动画,就可以移除,就是调用dontAnimate()方法。

缩放

对于任何图像操作,调整大小可能让图片失真。但是我们要尽可能的避免发生这种情况发生。Glide 提供了两个图形装换的操作提供了两个标准选项:centerCrop 和 fitCenter

  • centerCrop

这个方法是裁剪图片,当图片比ImageView大的时候,他把把超过ImageView的部分裁剪掉,尽可能的让ImageView 完全填充,但图像可能不会全部显示

        Glide.with(context).load("http://p2.so.qhimgs1.com/sdr/512_768_/t01a07586d3eec4218e.jpg").centerCrop().into(imageView)
  • fitCenter
    它会自适应ImageView的大小,并且会完整的显示图片在ImageView中,但是ImageView可能不会完全填充
  • override(horizontalSize, verticalSize)

Glide加载图片大小是自动调整的,他根据ImageView的尺寸自动调整加载的图片大小,并且缓存的时候也是按图片大小缓存,每种尺寸都会保留一份缓存,当然我们还可以自己定义它的大小,调用 override(horizontalSize, verticalSize) 。这将在图片显示到 ImageView之前重新改变图片大小

        Glide.with(context).load("http://p2.so.qhimgs1.com/sdr/512_768_/t01a07586d3eec4218e.jpg").dontAnimate().override(400,600).fitCenter().into(imageView);

Gif

//加载Gif文件
Glide.with(context).load("http://i。。。。。.gif").into(imageView);

是不是很简单,依然是一句话就实现显示网络上Gif功能。Glide还提供了Gif相关操作的两个方法。如果我们想将Gif显示成图片的第一帧只需要使用asBitmap()方法即可。如果我们有这个需求,就是严格显示成Gif,那么当传入了一个非Gif 的url时,我们当做错误处理。此时我们可以使用asGif()方法

        Glide.with(context).load("http:。。。。。。").asGif().error(R.mipmap.error).placeholder(R.mipmap.place).into(imageView);

Glide 将会把这个 load 当成失败处理。这样做的的好处是,.error() 回调被调用并且错误占位符被显示,如果url是Gif,那么会没什么变化,这样就检查了load参数是否为Gif.

好了,这一片都是简单的方法介绍,后续会继续退出进阶篇和源码篇。

你可能感兴趣的:(Android框架源码分析——Glide详解(基础篇))