Android 图片加载框架Glide

Android 图片加载框架Glide

一:概述
Glide是目前在Android的开发中很是的受欢迎,几乎是随便开一个项目都会想到使用Glide当图片加载框架
1.主要特色:
(1)支持Memory和Disk图片缓存
(2)支持gif和webp格式图片
(3)根据Activity/Fragment生命周期自动管理请求
(4)使用Bitmap Pool可使用Bitmap复用
(5)对于回收的Bitmap会主动调用recycle,减小系统回收压力
2.依赖
高版本html

//这是对于Glide 4的依赖和以前Glide 有一些区别
 implementation 'com.github.bumptech.glide:glide:4.11.0'
  annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
  //相比于Glide 3,这里要多添加一个compiler的库,这个库是用于生成Generated API的

对于Kolin
若是你在 Kotlin 编写的类里使用 Glide 注解,你须要引入一个 kapt 依赖,以代替常规的 annotationProcessor 依赖android

dependencies {
 implementation 'com.github.bumptech.glide:glide:4.11.0'
 kapt 'com.github.bumptech.glide:compiler:4.11.0'
}

低版本git

implementation 'com.github.bumptech.glide:glide:3.7.0'

咱们针对于Glide 3的一些方法使用讲解
二:基本使用
在AndroidManifest文件添加权限
<uses-permission android:name="android.permission.INTERNET"/>github

public class ElevenActivity extends AppCompatActivity implements View.OnClickListener {
    private Button btn;
    private ImageView imageView;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_eleven);
        imageView= findViewById(R.id.iv_img);
        btn=findViewById(R.id.btn_click);
        btn.setOnClickListener(this::onClick);
    }

    @Override
    public void onClick(View v) {
        String url = "http://guolin.tech/book.png";
        Glide.with(this).load(url).into(imageView);//Glide请求加载图片的最简单
    }
}

1.加载图片web

Glide.with(this).load(url).into(imageView);

image.png
加载网络图片,从文件中加载,加载资源id等缓存

File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"Test.jpg");
Glide.with(context).load(file).into(imageViewFile);

2.占位符placeholder加载时候未加载出来前先有一个占位图,error加载失败图片,fallback 在Drawable 在请求的url/model为 null 时展现。网络

Glide.with(this).load(url).centerCrop().placeholder(R.mipmap.ic_launcher).error(R.mipmap.login_icon).into(imageView);//占位符
 Glide.with(this).load(url).fallback(R.mipmap.ic_launcher).into(imageView);// 若是请求的url/model为 null 的时候展现的图片 (若是没有设置,仍是展现placeholder的占位符)

3.asGif(),asBitmap()显示gif动画,asGif()判断是不是gif动画,asBitmap()能够加载静态gif图即gif图的第一帧app

Glide.with(this).load(url).asGif().into(imageView);//显示Gif动画
 Glide.with(this).load(url).asBitmap().into(imageView);//显示Bitmap图片

4.设置动画
.crossFade() :Glide提供淡如淡出;
crossFade(int duration)//设置动画时间
crossFade(Animation animation, int duration)//自定义动画和时间
.dontAnimate()//取消动画
.animate(android.R.anim.slide_in_left):Android系统提供,从左到右滑出加载动画框架

Glide.with(this).load(url).crossFade().into(imageView);
  Glide.with(this).load(url).animate(android.R.anim.slide_in_left).into(imageView);//从左到右加载图片

5.调整图片大小
单位是像素,裁剪你的图片大小。其实Glide已经会自动根据你ImageView裁剪照片来放在缓存中了。可是不想适应ImageView大小的时候,能够调用这个方法.override()为ImageView指定大小ide

Glide.with(this).load(url).override(100,100).animate(android.R.anim.slide_in_left).into(imageView);

6.裁剪图片.fitCenter()和.CenterCrop()
当须要裁剪大小时,有个.centerCrop方法,这个方法的裁剪会让你的ImageView周围不会留白,还有一个.fitCenter()方法,表示让你的Image彻底显示,尺寸不对时,周围会留白。

Glide.with(this).load(url).fitCenter().animate(android.R.anim.slide_in_left).into(imageView);

7.设置缩略图.thumbnail()
image.png
.thumbnail()方法的目的就是让用户先看到一个低解析度的图,点开后,再加载一个高解析度的图。

Glide.with(this).load(url).fitCenter().thumbnail(0.1f).animate(android.R.anim.slide_in_left).into(imageView);

一种更高级的缩略图加载方式:

当缩略图也须要经过网络加载所有解析度的时候。

private void loadImageThumbnailRequest() {
    DrawableRequestBuilder<String> thumbnailRequest = Glide.with(context.load(eatFoodyImages[2]);
    Glide.with(context).load(UsageExampleGifAndVideos.gifUrl).thumbnail(thumbnailRequest).into(imageView);
}

8.设置图片显示效果(圆角、圆形、高斯模糊、蒙板、裁剪等等).bitmapTransform()

Glide.with(this).load(R.mipmap.ic_image_sample)
    //模糊
    .bitmapTransform(new BlurTransformation(this))
    //圆角
    .bitmapTransform(new RoundedCornersTransformation(this, 24, 0, RoundedCornersTransformation.CornerType.ALL))
    //遮盖
    .bitmapTransform(new MaskTransformation(this, R.mipmap.ic_launcher))
    //灰度
    .bitmapTransform(new GrayscaleTransformation(this))
    //圆形
    .bitmapTransform(new CropCircleTransformation(this))
    .into(imageView);

除此以外还有实现诸如马赛克、明暗度等更多滤镜处理:

  • ToonFilterTransformation
  • SepiaFilterTransformation
  • ContrastFilterTransformation
  • InvertFilterTransformation
  • PixelationFilterTransformation
  • SketchFilterTransformation
  • SwirlFilterTransformation
  • BrightnessFilterTransformation
  • KuwaharaFilterTransformation
  • VignetteFilterTransformation

9.Gilde的缓存
缓存是为了减小或者杜绝多的网络请求。为了不缓存,Glide用了内存缓存和‘外存缓存机制’,而且 提供了相应的方法,彻底封装,不须要处理细节。Glide会自动缓存到内存,除非调用.skipMemoryCache( true )。尽管调用了这个,Glide仍是会缓存到外存,还有一种情形,就是有一张图片,可是这张图变化很是快,这个时候可能并不想缓存到外存中,就使用.diskCacheStrategy( DiskCacheStrategy.NONE )。若是你两种都不须要,能够两个方法组合着一块儿使用。

  • DiskCacheStrategy.NONE 什么都不缓存
  • DiskCacheStrategy.SOURCE 仅仅只缓存原来的全分辨率的图像
  • DiskCacheStrategy.RESULT 仅仅缓存最终的图像,即下降分辨率后的(或者是转换后的)
  • DiskCacheStrategy.ALL 缓存全部版本的图像(默认行为)

    //设置跳过内存缓存
     Glide.with(this).load(url).animate(android.R.anim.slide_in_left).skipMemoryCache(true).into(imageView);
     
    //设置硬盘缓存没有
    Glide.with(this).load(url).animate(android.R.anim.slide_in_left).diskCacheStrategy(DiskCacheStrategy.NONE).into(imageView);

    10.请求的优先级.priority()
    载图片确定也是有前后顺序,Glide提供了.priority()这个方法,它接收如下几个参数:

  • Priority.LOW
  • Priority.NORMAL
  • Priority.HIGH
  • Priority.IMMEDIATE
Glide.with(this).load(url).animate(android.R.anim.slide_in_left).diskCacheStrategy(DiskCacheStrategy.NONE).priority(Priority.LOW).into(imageView);

11.监听器配置.listener()

@Override
    public void onClick(View v) {
        String url = "http://guolin.tech/book.png";
        Glide.with(this).load(url).animate(android.R.anim.slide_in_left).listener(mRequestListener).into(imageView);


    }
    private RequestListener<String, GlideDrawable> mRequestListener = new RequestListener<String, GlideDrawable>() {
        @Override
        public boolean onException(Exception e, String model, com.bumptech.glide.request.target.Target<GlideDrawable> target, boolean isFirstResource) {
            //显示错误信息
            Log.w("TAG", "onException: ", e);
            //打印请求URL
            Log.d("TAG", "onException: " + model);
            //打印请求是否还在进行
            Log.d("TAG", "onException: " + target.getRequest().isRunning());
            return false;
        }

        @Override
        public boolean onResourceReady(GlideDrawable resource, String model, com.bumptech.glide.request.target.Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
            return false;
        }


    };

}

这里的onException捕获异常,若是返回true表示咱们本身处理掉了异常,false表示交给Glide去处理,由于咱们定义了.error()那么就显示error里面的内容。

这里onResourceReady表示是否准备资源显示,返回true表示用户本身已经设置好资源,包括截取操做,动画操做之类的,准备好显示。false表示交给Glide

如此修改后,就可以看到图片加载日志了,方便咱们调试

12.替换掉自带的HttpClient
导入须要替换的HttpClient,能够选择Volley也能够选择OkHttp,咱们使用Okhttp,在Module的build.gradle文件中配置

implementation "com.github.bumptech.glide:okhttp3-integration:4.11.0"

13.Glide 4使用
而Glide 4中引入了一个RequestOptions对象,将这一系列的API都移动到了RequestOptions当中。这样作的好处是可使咱们摆脱冗长的Glide加载语句,并且还能进行本身的API封装,由于RequestOptions是能够做为参数传入到方法中的。

RequestOptions options = new RequestOptions()
        .placeholder(R.drawable.ic_launcher_background)
        .error(R.drawable.error)
        .diskCacheStrategy(DiskCacheStrategy.NONE);
Glide.with(this)
     .load(url)
     .apply(options)
     .into(imageView);

14.关于图片变换,最后咱们再来看一个很是优秀的开源库,glide-transformations。它实现了不少通用的图片变换效果,如裁剪变换、颜色变换、模糊变换等等,使得咱们能够很是轻松地进行各类各样的图片变换
添加库

dependencies {
    implementation 'jp.wasabeef:glide-transformations:3.0.1'
}

三:使用Generated API

Generated API是Glide 4中全新引入的一个功能,它的工做原理是使用注解处理器 (Annotation Processor) 来生成出一个API,在Application模块中可以使用该流式API一次性调用到RequestBuilder,RequestOptions和集成库中全部的选项。
Generated API对于熟悉Glide 3的朋友来讲那是再简单不过了,基本上就是和Glide 3如出一辙的用法,只不过须要把Glide关键字替换成GlideApp关键字,以下所示:

GlideApp.with(this)
        .load(url)
        .placeholder(R.drawable.loading)
        .error(R.drawable.error)
        .skipMemoryCache(true)
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .override(Target.SIZE_ORIGINAL)
        .circleCrop()
        .into(imageView);

不过,有可能你的IDE中会提示找不到GlideApp这个类。这个类是经过编译时注解自动生成的,首先确保你的代码中有一个自定义的模块,而且给它加上了@GlideModule注解,也就是咱们在上一节所讲的内容。而后在Android Studio中点击菜单栏Build -> Rebuild Project,GlideApp这个类就会自动生成了。

@GlideModule
public final class MyAppGlideModule extends AppGlideModule {

    @Override
    public boolean isManifestParsingEnabled() {
        return false;
    }

    @Override
    public void registerComponents(
            @NonNull Context context, @NonNull Glide glide, Registry registry) {
        // 配置glide网络加载框架
        registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory());
    }

    @Override
    public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
        builder.setDefaultRequestOptions(
                new RequestOptions().format(DecodeFormat.PREFER_ARGB_8888));
        if (BuildConfig.DEBUG) {
            builder.setLogLevel(Log.DEBUG);
        }
    }
}

能够看到,在MyAppGlideModule类当中,咱们重写了applyOptions()和registerComponents()方法,这两个方法分别就是用来更改Glide配置以及替换Glide组件的。

注意在MyAppGlideModule类在上面,咱们加入了一个@GlideModule的注解,这是Gilde 4和Glide 3最大的一个不一样之处。在Glide 3中,咱们定义了自定义模块以后,还必须在AndroidManifest.xml文件中去注册它才能生效,而在Glide 4中是不须要的,由于@GlideModule这个注解已经可以让Glide识别到这个自定义模块了
四:自定义本身的扩展类
定制本身的API须要借助@GlideExtension和@GlideOption这两个注解。建立一个咱们自定义的扩展类,代码以下所示:

@GlideExtension
public class MyGlideExtension {

    private MyGlideExtension() {

    }

    @GlideOption
    @NonNull
    public static BaseRequestOptions<?> roundCorner(@NonNull BaseRequestOptions<?> options) {
        return options.transform(new RoundedCorners(SizeUtils.dp2px(5)));
    }

}

这里咱们定义了一个MyGlideExtension类,而且给加上了一个@GlideExtension注解,而后要将这个类的构造函数声明成private,这都是必需要求的写法。

接下来就能够开始自定义API了,这里咱们定义了一个cacheSource()方法,表示只缓存原始图片,并给这个方法加上了@GlideOption注解。注意自定义API的方法都必须是静态方法,并且第一个参数必须是RequestOptions,后面你能够加入任意多个你想自定义的参数

GlideApp.with(this)
        .load(url)
        .cacheSource()
        .into(imageView);

五:Glide 4使用添加依赖

implementation 'com.github.bumptech.glide:glide:4.11.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
    implementation "com.github.bumptech.glide:okhttp3-integration:4.11.0"

使用:

Glide.with(this).load(R.mipmap.login_icon).placeholder(R.mipmap.ic_launcher).into(imageView);
  
  //或者使用
  RequestOptions options=new RequestOptions().placeholder(R.mipmap.ic_launcher);//questOptions 容许你一次指定一系列的选项,而后对多个加载重用它们
        Glide.with(this).load(R.mipmap.login_icon).apply(options).into(imageView);
        //这样抽取出来能够屡次加载

自定义模块@GlideMoudule,这样的话就能建立一个自定模块类
咱们重写了applyOptions()和registerComponents()方法,这两个方法分别就是用来更改Glide配置以及替换Glide组件的。

@GlideModule
public final class MyAppGlideModule extends AppGlideModule {

    @Override
    public boolean isManifestParsingEnabled() {
        return false;
    }

    @Override
    public void registerComponents(
            @NonNull Context context, @NonNull Glide glide, Registry registry) {
        // 配置glide网络加载框架
        registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory());
    }

    @Override
    public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
        builder.setDefaultRequestOptions(
                new RequestOptions().format(DecodeFormat.PREFER_ARGB_8888));
        if (BuildConfig.DEBUG) {
            builder.setLogLevel(Log.DEBUG);
        }
    }
}

而后Bulid-->Rebulid Project
image.png

//这样的话就是吧Glide 换成GlideApp
 GlideApp.with(this).load(R.mipmap.login_icon).into(imageView);

自定义Api: mini()方法

@GlideExtension
public class MyGlideExtension {
    private MyGlideExtension() {

    }
    @GlideOption
    @NonNull
    public static BaseRequestOptions<?> mini(
            @NonNull BaseRequestOptions<?> options, int size) {
        return options.fitCenter().override(size);
    }
    //这是一个Api扩展,使用居中裁剪和调整图片size大小尺寸
}

而后Bulid-->Rebulid Project
最后调用

GlideApp.with(this).load(R.mipmap.login_icon).mini(66).into(imageView);

Glide相关博客:https://guolin.blog.csdn.net/...

END:我开始在人世间漂流, 选择过大大小小的梦想

相关文章
相关标签/搜索