【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);
相关推荐
千里马学框架1 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc1 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo1 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077001 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼1 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone1 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen1 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone1 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui