【Android】Glide的使用

简介

是一个快速高效的Android开源媒体管理和图像加载框架,它将媒体解码、内存和磁盘缓存以及资源池封装到一个简单易用的界面中。

Glide支持拉取,解码和展示视频快照,图片和GIF动画。

**优点:**1.使用简单,并且支持多种图片格式,既可以获取网络资源又可以获取本地资源,不用处理网络请求、缓存、内存管理、图片解码等复杂逻辑;

2.性能优秀:自动管理 Bitmap 内存,防止内存溢出,可以自动根据ImageView调整图片大小,节省内存。

所需权限

网络加载

通过网络连接加载图像,需要添加INTERNETACCESS_NETWORK_STATE权限

xml 复制代码
<manifest>
    ...
    <uses-permission android:name="android.permission.INTERNET"/>
    <!--允许Glide监视连接状态-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  ...
</manifest>

本地存储

要从DCIM或图片等本地文件夹加载图像,需要添加READ_EXTERNAL_STORAGE权限

xml 复制代码
<manifest>
    ...
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  ...
</manifest>

要将Glide的缓存存储到公共sdcard上,需要使用WRITE_EXTERNAL_STORAGE权限

xml 复制代码
<manifest>
    ...
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  ...
</manifest>

基本用法

在build.gradle中添加依赖

java 复制代码
implementation 'com.github.bumptech.glide:glide:4.12.0'
  • **with(Context context)**可以传递Activity/Fragment,并且它会和所传参数的生命周期进行绑定
  • **load(String imageUrl)**加载图片,传入的是图片的URL地址
  • placeholder 占位符是在请求正在进行时,显示的图片
  • error 表示请求失败时,会显示设置的图片
  • fallback 表示传递的是null值时,会显示设置的图片
  • into(ImageView targetImageView) 传入要展示图片的控件
  • transform 用来完成剪裁(切圆)或对位图应用过滤器,但它也可以用于转换GIF动画,甚至自定义的资源类型
  • override 将图片大小调整为给定的尺寸(以像素为单位),调整大小不考虑纵横比
  • transition 控制图片加载完成后的过渡动画效果

简单使用

加载图片

java 复制代码
 Uri uri=Uri.parse("https://th.bing.com/th/id/R.c0b37497ff48b914ae99c7dcdcf7b95d?rik=HUXUOfyLgw7hHA&pid=ImgRaw&r=0");
        //加载网络图片
        Glide.with(this).load(uri).into(imageView);
        //应用资源
        Glide.with(this).load(R.drawable.image1).into(imageView);
        //加载圆形图片
        Glide.with(this).load(uri).circleCrop().into(imageView);
        //增加占位符和加载失败显示图片
          Glide.with(this)
                .load(uri)
                .placeholder(R.drawable.image1)
                .error(R.drawable.image1)
                .fallback(R.drawable.image1)
                .into(imageView);
        //图片大小调整
        Glide.with(this).load(uri).override(600,200).into(imageView);

缩放图片

对于任何图像的任何处理,调整图像的大小可能会扭曲长宽比,丑化图片的显示。

Glide提供了变换去处理图片显示

  • centerCrop():会缩放图片,让图片充满整个ImageView的边框,然后裁掉超出的部分,ImageView会被完全填充满,但是图片可能不能完全显示
  • fitCenter():会缩放图片让两边都相等或小于ImageView的所需求的边框,图片会被完整显示但可能不会填满整个ImageView
java 复制代码
Glide.with(this).load(uri).override(600,200).centerCrop().into(imageView);
Glide.with(this).load(uri).override(600,200).fitCenter().into(imageView);

图片过渡

使用crossfade动画可以使改变图片的效果变得更加平滑

java 复制代码
  Glide.with(this)
                .load(uri)
                .placeholder(R.drawable.image1)
                .error(R.drawable.image1)
                .transition(DrawableTransitionOptions.withCrossFade())//withCrossFade(int duration)方法可以传入时间,默认时间是300毫秒
                .into(imageView);

除此之外,Glide还支持xml中自定义的动画文件

java 复制代码
 Glide.with(this)
                .load(uri)
                .transition(GenericTransitionOptions.with(R.anim.zoom_in))
                .into(imageView);

加载gif

java 复制代码
String gifUrl="https://i-blog.csdnimg.cn/blog_migrate/c0a5b53d30d8e1c25ea014b113b66fdf.gif";
        Glide.with(this).load(gifUrl).into(imageView);

还可以使用asGif()强迫生成一个gif

java 复制代码
Glide.with(this).asGif().load(gifUrl).error(R.drawable.image1).into(imageView);

如果只想显示gif的第一帧图片,可以调用asBitmap()将其作为常规图片显示

java 复制代码
Glide.with(this).asBitmap().load(gifUrl).into(imageView);

显示本地视频缩略图

java 复制代码
 String filePath = "/storage/emulated/0/Pictures/targetVideo.mp4";
        Glide.with(this)
                .asBitmap()
                .load(Uri.fromFile(new File(filePath)))
                .into(imageView);

取消加载

java 复制代码
Glide.with(this).clear(imageView);

注意:及时取消加载不是必须的操作,实际上,当Glide.with()中传入的Activity或Fragment实例销毁时,Glide会自动取消加载并回收资源。

高斯模糊

使用库

java 复制代码
implementation 'jp.wasabeef:glide-transformations:4.3.0'

简单使用

java 复制代码
 public static void loadImageViewTransform(Context mcontext, byte[] path, ImageView imageView){
     //前一个参数为圆角,后一个为模糊值,越大越模糊
        BlurTransformation blurTransformation=new BlurTransformation(10,15);
        Glide.with(mcontext).load(path)
                .apply(RequestOptions.bitmapTransform(blurTransformation))
                .into(imageView);
    }

组合使用

高斯模糊可以和各种效果组合

java 复制代码
 @GlideOption
    public static BaseRequestOptions<?> applyBlurHead(BaseRequestOptions<?> options,int size){
        //高斯模糊
        BlurTransformation blurTransformation=new BlurTransformation(20,1);
        //高斯模糊和切圆组合
        return options.override(size)
                .placeholder(R.drawable.image1)
                .error(R.drawable.ic_launcher_background)
                .transform(new MultiTransformation<>(blurTransformation,new CircleCrop()));
    }

注意:默认情况下,对每一个后续呼叫transform()或任何特定的transform方法(fitCenter(),centerCrop(),bitmapTransform()等)将取代先前的transform。

要将多个转换应用于单个加载,可使用MultiTransformation

自定义API

可以通过Glide提供的注解,来添加自己定义的API

  • GlideModule注解用于AppGlideModule

  • GlideExtension注解用于表示一个扩展Glide API的类,任何拓展的Glide API的类都必须使用这个注解来标记,被@GlideExtension注解的类以工具类的方式实现

    被@GlideExtension注解的类有两种扩展方式:

    • GlideOption-注解为RequestOptions添加一个选项
    • GlideType-添加新的资源类型的支持(GIF,SVG等)

首先添加Glide注解处理器配置

xml 复制代码
annotationProcessor "com.github.bumptech.glide:compiler:4.12.0"

项目需要通过GlideModule注解继承子AppGlideModule类的子类,并通过GlideExtension注解到工具类上来扩展自定义GlideAPI。

使用GlideOption和GlideType注解的方法必须为静态方法,经过Rebuild Project之后,最后会被编译到XXXRequest.java类

java 复制代码
//Application模块内,GlideModule注解自定义子类继承AppGlideModule,可以不用重写任何方法
@GlideModule(glideName = "GlideApp")
public class MyGlideModule extends AppGlideModule {
    public void applyOptions(Context context, GlideBuilder builder){
        //可以添加一些全局性的options
        super.applyOptions(context, builder);
    }
}

@GlideExtension
public class MyGlideExtensions {
    private MyGlideExtensions(){

    }
    //GlideOption注解,添加自定义的Option
    @GlideOption
    public static BaseRequestOptions<?> mMiniThunb(BaseRequestOptions<?> options,int size){
        return options.fitCenter().override(size);
    }
    private static final RequestOptions DECODE_TYPE_GIF=RequestOptions.decodeTypeOf(GifDrawable.class);
    //GlideType注解,添加自定义的资源类型
    @GlideType(GifDrawable.class)
    public static RequestBuilder<GifDrawable> asMyGif(RequestBuilder<GifDrawable> requestBuilder){
        return requestBuilder
            .transition(new DrawableTransitionOptions())//设置用于在加载完成时从占位符到正常显示的过渡效果
            .apply(DECODE_TYPE_GIF);// 将自定义的ResourceClass设置到resourceClass参数
    }
}

//使用自定义API
        GlideApp.with(this)
                .asMyGif()//使用自定义的资源
                .load(gifUrl)
                .mMiniThunb(600)//使用自定义的Option
                .into(imageView);
相关推荐
Gary Studio1 小时前
Android AIDL HAL工程结构示例
android
y = xⁿ2 小时前
MySQL八股知识合集
android·mysql·adb
andr_gale2 小时前
04_rc文件语法规则
android·framework·aosp
祖国的好青年3 小时前
VS Code 搭建 React Native 开发环境(Windows 实战指南)
android·windows·react native·react.js
黄林晴4 小时前
警惕!AGP 9.2 别只改版本号,R8 规则与构建链路全线收紧
android·gradle
小米渣的逆袭4 小时前
Android ADB 完全使用指南
android·adb
儿歌八万首4 小时前
Jetpack Compose Canvas 进阶:结合 animateFloatAsState 让自定义图形动起来
android·动画·compose
zhangphil5 小时前
Android Page 3 Flow读sql数据库媒体文件,Kotlin
android·kotlin
神探小白牙5 小时前
echarts,3d堆叠图
android·3d·echarts