Glide详解

2023-05-16

现在Android上的图片加载框架非常成熟,从最早的老牌图片加载框架UniversalImageLoader,到后来Google推出的Volley,再到后来的新兴军Glide和Picasso,当然还有Facebook的Fresco。每一个都非常稳定,功能也都十分强大。但是它们的使用场景基本都是重合的,也就是说我们基本只需要选择其中一个来进行学习和使用就足够了,每一个框架都尝试去掌握的话则有些浪费时间。Glide和Picasso 有90%相似度,而Glide在Picasso基础上进行的二次开发,可以其优势显而易见。

一.添加依赖

repositories {
  mavenCentral()
  google()
}

dependencies {
implementation 'com.github.bumptech.glide:glide:4.8.0'//glide第三方图片加载所需要的包
}

二.添加权限

   <uses-permission android:name="android.permission.INTERNET"/>
    //它可以监听用户的连接状态并在用户重新连接到网络时重启之前失败的请求
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    //用于硬盘缓存和读取
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

 

三.用法

3.1基本使用

string url="图片地址";

3.1.1加载图片三步走,1,with; 2,load; 3 into;

Glide.with(this)             //with()方法可以接收Context、Activity或者Fragment类型的参数
                .load(url)        //load方法中不仅可以传入图片地址,还可以传入图片文件File,resource,图片的byte数组等
                .into(imageView);
    注意with()方法中传入的实例会决定Glide加载图片的生命周期,如果传入的是Activity或者Fragment的实例,那么当这个Activity或Fragment被销毁的时候,图片加载也会停止。如果传入的是ApplicationContext,那么只有当应用程序被杀掉的时候,图片加载才会停止。

// 加载本地图片
File file = new File(getExternalCacheDir() + "/image.jpg");
Glide.with(this).load(file).into(imageView);

// 加载应用资源
int resource = R.drawable.image;
Glide.with(this).load(resource).into(imageView);

// 加载二进制流
byte[] image = getImageBytes();
Glide.with(this).load(image).into(imageView);

// 加载Uri对象
Uri imageUri = getImageUri();
Glide.with(this).load(imageUri).into(imageView);
 注意with()方法中传入的实例会决定Glide加载图片的生命周期,如果传入的是Activity或者Fragment的实例,那么当这个Activity或Fragment被销毁的时候,图片加载也会停止。如果传入的是ApplicationContext,那么只有当应用程序被杀掉的时候,图片加载才会停止。


加载圆形图

Glide.with(this)
        .load(R.mipmap.ic_splash_bg)
        .apply(bitmapTransform(new CropCircleTransformation()))
        .into(mImageHead);
 模糊过滤

Glide.with(this)
                .load(R.mipmap.ic_splash_bg)
                .apply(bitmapTransform(new BlurTransformation( 25, 4)))
                .into(mImageView);


  
    3.1.2取消图片也是三步走,1,with; 2,load; 3 clear;
    Glide.with(this).load(url).clear();
    一般来很少会用到取消图片的,因为图会跟with(this)生命周期消亡而消亡的。


3.2Glide中的大部分设置项都可以通过 RequestOptions 类和 apply() 方法来应用到程序中

RequestOptions options = new RequestOptions()
                .placeholder(R.mipmap.ic_launcher)                //加载成功之前占位图
                .error(R.mipmap.ic_launcher)                    //加载错误之后的错误图
                .override(400,400)                                //指定图片的尺寸
                //指定图片的缩放类型为fitCenter (等比例缩放图片,宽或者是高等于ImageView的宽或者是高。)
                .fitCenter()
                //指定图片的缩放类型为centerCrop (等比例缩放图片,直到图片的狂高都大于等于ImageView的宽度,然后截取中间的显示。)
                .centerCrop()
                .circleCrop()//指定图片的缩放类型为centerCrop (圆形)
                .skipMemoryCache(true)                            //跳过内存缓存
                .diskCacheStrategy(DiskCacheStrategy.ALL)        //缓存所有版本的图像
                .diskCacheStrategy(DiskCacheStrategy.NONE)        //跳过磁盘缓存
                .diskCacheStrategy(DiskCacheStrategy.DATA)        //只缓存原来分辨率的图片
                .diskCacheStrategy(DiskCacheStrategy.RESOURCE)    //只缓存最终的图片
                ;
        Glide.with(this)
                .load(url)
                .apply(options)
                .into(imageView);
注意 实际上,使用Glide在大多数情况下我们都是不需要指定图片大小的,因为Glide会自动根据ImageView的大小来决定图片的大小,以此保证图片不会占用过多的内存从而引发OOM。不过,如果你真的有这样的需求,必须给图片指定一个固定的大小,Glide仍然是支持这个功能的。修改Glide加载部分的代码,仍然非常简单,这里使用override()方法指定了一个图片的尺寸。也就是说,Glide现在只会将图片加载成400*400像素的尺寸,而不会管你的ImageView的大小是多少了。如果你想加载一张图片的原始尺寸的话,可以使用Target.SIZE_ORIGINAL关键字,.override(Target.SIZE_ORIGINAL);这样的话,Glide就不会再去自动压缩图片,而是会去加载图片的原始尺寸。当然,这种写法也会面临着更高的OOM风险。
            这个diskCacheStrategy()方法基本上就是Glide硬盘缓存功能的一切,它可以接收五种参数:
            DiskCacheStrategy.NONE: 表示不缓存任何内容。
            DiskCacheStrategy.DATA: 表示只缓存原始图片。
            DiskCacheStrategy.RESOURCE: 表示只缓存转换过后的图片。
            DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。
            DiskCacheStrategy.AUTOMATIC: 表示让Glide根据图片资源智能地选择使用哪一种缓存策略(默认选项)。
                
    Glide其中一个非常亮眼的功能就是可以加载GIF图片,而同样作为非常出色的图片加载框架的Picasso是不支持这个功能的。而且使用Glide加载GIF图并不需要编写什么额外的代码,Glide内部会自动判断图片格式。
    但是如果我想指定加载格式该怎么办呢?想实现这个功能仍然非常简单,我们只需要再串接一个新的方法就可以了
        Glide.with(this)
             .asBitmap()
             .load(url)
             .into(imageView);
        这里在with()方法的后面加入了一个asBitmap()方法,这个方法的意思就是说这里只允许加载静态图片,不需要Glide去帮我们自动进行图片格式的判断了。如果你传入的还是一张GIF图的话,Glide会展示这张GIF图的第一帧,而不会去播放它。对应的方法是asGif()。而Glide 4中又新增了asFile()方法和asDrawable()方法,分别用于强制指定文件格式的加载和Drawable格式的加载.

另:Glide加载转换Bitmap 方法:

try {
    Bitmap bitmap = Glide
            .with(this)
            .asBitmap()//这一个必须加
            .load("url")
            .into(100, 100)
            .get();
} catch (InterruptedException e) {
    e.printStackTrace();
} catch (ExecutionException e) {
    e.printStackTrace();
}

 

四.Glide4.8.0升级后的使用

glide升级到4.8.0后原方法error/preload/fallback/signature无法使用

现在改成:

 

原方法error/preload/fallback等方法都在RequestOptions中添加,其中之前.signature()方法形参支持使用StringSignature,但是现在StringSignature完全被废掉了,不过你可以借用signature方法中的Key中的一个使用相对方便的子类ObjectKey,构造方法以Object为参数:

signature它是用来刷新glide填充的图片刷新用的。
简单使用,先整起来,具体原因下次分晓。

五.Glide常见错误

5.1java.lang.IllegalArgumentException: You must not call setTag() on a view

使用Glide发现这个bug,发现glide要对ImageView设置url为tag会报错,解决方法:imageView的setTag()去掉

或者:https://blog.csdn.net/yuangudashen/article/details/75287670

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Glide详解 的相关文章

  • Android开发环境配置

    环境为jdk11 43 android studio2021 jdk11的安装 xff1a 参考https blog csdn net qq 22136439 article details 103295019 注意 xff1a 1 jdk
  • java中文字符乱码编码转换大全

    System out println new String myFileName getBytes 34 gbk 34 System out println new String myFileName getBytes 34 utf 8 3
  • java实现打印套打功能

    package test import java awt print import java awt 实现套打 xff0c 把套打的格式当成一张图片 xff0c 将要填入的数据按其在图片在坐标来定位 public class PrintTe
  • oracle中not in的优化

    ORACLE中NOT IN 的替代 http myjcwy iteye com blog 553563 典型的查询方式为 xff1a SELECT TITLE FROM BOOKSHELF WHERE TITLE NOT IN SELECT
  • Visual Stdio 中的error C2001: 常量中有换行符

    error C2001 常量中有换行符 问题 xff1a 使用Visual Stdio xff0c cout中文的时候 xff0c 有的时候可以正常编译并运行 xff0c 但是有的时候会出现error C2001 常量中有换行符 出现err
  • oracle实现每天定时执行一个计划任务

    http www shangxueba com jingyan 1614101 html oracle实现每天定时执行一个计划任务 创建测试表 SQL gt create table a a date 表已创建 创建一个自定义过程 SQL
  • Spring Security配置访问权限在登录页循环并报错302

    事情是这样的 xff0c 在学习Spring Security框架时 xff0c 使用框架默认的登录页面 xff0c 没有任何问题输入正确的账户和密码后都能登录 xff0c 但是将登录页面换为自定义的页面后就无法登录了 如下 xff1a 密
  • .net core基于Oauth2+jwt两种方式实现身份认证(附单点登录)

    引用地址 xff1a net core基于Oauth2 43 jwt两种方式实现身份认证 附单点登录 cslx5zx5的博客 CSDN博客 net core oauth2 基于 net core 3 1微服务架构的SSO单点登录实战 本文所
  • wordpress中文网站代码下载

    wordpress下载中文网站代码 wordpress网站 https cn wordpress org 下载各个中文版本的 xff1a 提示 xff1a 不用用积分去下载了 方法 xff1a 登录网站 xff1a

随机推荐

  • 源码编译装redis

    源码编译装redis 1 下载包 span class token punctuation span root 64 ZZQVM1 span class token punctuation span span class token com
  • I2C协议

    文章目录 一 什么是I2C xff1f 二 物理层与协议层1 物理层 xff08 1 xff09 I2C总线 xff1a xff08 2 xff09 从地址 xff1a xff08 2 xff09 三种传输模式 2 协议层 xff08 1
  • C++智能指针

    文章目录 前言shared ptrunique ptrweak ptr使用智能指针安全吗 xff1f 前言 下面简单的概括了 3中智能指针的在使用时候需要注意的一些地方 xff0c 三种智能指针在离开其作用域之后都会被自动释放 xff0c
  • centos 7 安装 samba

    centos 7 安装 samba 最近想在linux系统下开发C 43 43 程序 xff0c 想用window的编辑器写代码 xff0c 所以在centos 系统下安装了samba xff0c 让window系统挂载centos 系统的
  • win10如何退出“暂停7天更新”? 恢复自动更新

    services msc 微软社区的解答 xff0c 我复bai制的 断开网络进du行如下操作 xff0c 如果遇到zhi程序占用的问题 xff0c 操作进入到dao安全模式 xff08 设置 更新和安全 恢复 立即重启 xff09 进行
  • 关于Qt中线程的挂起和唤醒问题

    为了平台的可移植性 xff0c 现在好多公司或开发者都在用Qt开发 xff0c 但是Qt开发文档有一个不非常理想的问题是 xff0c 有些问题描述的不是太详细 xff0c 特别是涉及到线程的挂起 xff0c 唤醒 和sleep 等问题 在Q
  • vscode不能跳转到定义的解决方法

    vscode不能跳转到定义的解决方法 0 分析1 安装global的依赖2 安装global3 安装插件并生成索引文件 0 分析 在Linux上使用vscode时发现跳转到定义非常缓慢 xff0c 甚至不能用 打开扩展C 43 43 Int
  • UI----UIslider 和UIcontrol的属性

    UISlide 属性 minimumValue 当值可以改变时 xff0c 滑块可以滑动到最小位置的值 xff0c 默认为 0 0 slider minimumValue 61 10 0 maximumValue 当值可以改变时 xff0c
  • JAVA转义字符详解

    一 JAVA中反斜杠 的作用 在不同的系统中 xff0c 路径的分隔符不同 xff0c 故需要做出判断 xff0c 并切换分隔符 VBS代码中确实不用转义 xff0c 但是在JAVA或JS中 xff0c 它采用的是C语言的语法 xff0c
  • 枚举(enum)

    一 什么是枚举 我们学习过单例模式 xff0c 即一个类只有一个实例 而枚举其实就是多例 xff0c 一个类有多个实例 xff0c 但实例的个数不是无穷的 xff0c 是有限个数的 例如word文档的对齐方式有几种 xff1a 左对齐 居中
  • 安卓so包常见报错问题

    一 lib arm64 system lib64 vendor lib64 couldn 39 t find 34 libAndroidIDCard so 我没有在libs文件夹下面创建类似 arm64 v8a 这个文件夹 xff0c 因为
  • Ubuntu详解

    介绍 Ubuntu是一个以桌面应用为主的Linux操作系统 xff0c 其名称来自非洲南部祖鲁语或豪萨语的 ubuntu 34 一词 xff0c 意思是 人性 我的存在是因为大家的存在 34 xff0c 是非洲传统的一种价值观 Ubuntu
  • Selinux详解

    一 介绍 1 1百度百科 SELinux Security Enhanced Linux 是美国国家安全局 xff08 NSA xff09 对于强制访问控制的实现 xff0c 是 Linux历史上最杰出的新安全子系统 NSA是在Linux社
  • repo init详解

    首先选择manifest源 xff0c 一般直接使用清华或中科大的镜像源 repo init u https aosp tuna tsinghua edu cn platform manifest是清华提供的镜像源 repo init u
  • Android Gradle plugin requires Java 11 to run.

    报错分析 因为别人拷过来的项目gradle版本不同 xff0c 对于jdk的兼容性要求不同 之前调试什么东西 xff0c 不小心改了环境的的某个部分 xff0c 现在莫名其妙所有的项目都运行不了了 后来百度翻译了一下 xff0c Andro
  • 安卓稳定性技术栈

    涉及技术内容 xff1a framework java层 语言 xff1a Java 1 开机启动流程 xff1a Android 7 0平台开机启动 android7 0开机自启 jamousjang的博客 CSDN博客 Android系
  • keil在线调试STM32,点三次运行才能跑到main的问题解决。

    现象 使用keil开发STM32 xff0c 下载完程序后 xff0c 不能运行 在main 的入口处加打印 xff0c 啥也没打出来 xff0c 说明程序都没跑到main 在线调试debug时发现了个有意思的现象 xff0c 每次都是点击
  • JAVA中“...”三个点

    可变长参数 xff0c 就是这个位置可以传入任意个该类型参数 简单来说就是个数组 1 testPoints 7 2 testPoints 7 9 11 3 testPoints new Integer 7 9 11 1 public sta
  • IMSI,SN,IMEI分别是什么意思

    1 IMSI 国际移动用户识别码 xff08 IMSI xff1a International Mobile Subscriber Identification Number xff09 是区别 移动用户 的标志 xff0c 储存在 SIM
  • Glide详解

    现在Android上的图片加载框架非常成熟 xff0c 从最早的老牌图片加载框架UniversalImageLoader xff0c 到后来Google推出的Volley xff0c 再到后来的新兴军Glide和Picasso xff0c