Android 图片加载框架 Glide4.x
概述
Glide是一个图片加载框架,使得我们可以轻松的加载和展示图片
Glide4.x新增apply()来进行设置,apply可以调用多次,但是如果两次apply
存在冲突的设置,会以最后一次为准
新增RequestOptions对象,用来存放设置
添加依赖
implementation 'com.github.bumptech.glide:glide:4.4.0' //添加支持
annotationProcessor 'com.github.bumptech.glide:compiler:4.4.0' //Glide4.x以上需要添加的支持 //如果需要加载网络图片,需要网络权限
<uses-permission android:name="android.permission.INTERNET" />
Gilde的图片加载
基本实例
Glide.with(this).load(url).into(imageView);
with() 是初始化Glide的实例
load() 是加载URL地址的图片
into() 是指定显示的控件
加载资源
Glide.with(this).load("https://www.baid.com/a.jpg").into(imageView);//加载网络图片 Glide.with(this).load(uri).into(imageView);//加载URL图片 Glide.with(this).load(R.mipmap.ic_launcher).into(imageView); //加载Resources图片 Glide.with(this).load(context.getResources().getAssets().open("a.png")).into(imageView); //加载assets图片 Glide.with(this).load(file).into(imageView);//加载File图片 Glide.with(this).load(byte[]).into(imageView); //加载二进制流图片
指定加载静态/动态图片
Gilde默认支持gif图片,但也可以选择指定加载gif动态图片或是静态图片
//asBitmap 指定加载静态图片,如果加载gif图片将会显示第一帧
Glide.with(this).asBitmap().load(imageUrl).into(imageView); //asGif 指定加载动态图片,如果加载静态图片将会显示加载失败或者显示异常时设定的占位图片
Glide.with(this).asGif().load(imageUrl).into(imageView); //Glide4.x以上新增.asFile()和.asDrawable(),强制使用文件格式和Drawable格式的加载,与3.x不同,4.x需要先设置加载格式,再load,不然会报错! //不允许加载网络视频,但是可以加载本地视频
Glide.with(context).load(Uri.fromFile(new File( filePath))).into(imageView);
设置图片大小&使用RequestOptions对象存放设置
Glide不会直接将图片的完整尺寸全部加载到内存中,而是用多少加载多少,所以Glide会自动根据ImageView的大小来决定图片的大小,但是也可以指定加载图片的大小(view的宽高设定为wrap_content才可以指定尺寸):
RequestOptions options = new RequestOptions();
options1.override(100, 100); //设置加载的图片大小 Glide.with(this)
.load(url)
.apply(options)
.into(imageView);
设置占位图
占位图是在加载未完成或者加载失败,为避免空白而设置的图片
RequestOptions options = new RequestOptions();
options.placeholder(R.drawable.ic_launcher_background); //设置加载未完成时的占位图
options.error(R.mipmap.load_error); //设置加载异常时的占位图 Glide.with(this)
.load(url)
.apply(options)
.into(imageView);
Glide加载监听
Glide.with(this).load(url)
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
//图片加载失败调用
return false;
} @Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
//图片加载完成时调用
return false;
}
})
.into(iv);
Glide的回调方法
SimpleTarget对象
SimpleTarget<Drawable> simpleTarget = new SimpleTarget<Drawable>() {
@Override
public void onResourceReady(Drawable resource, Transition<? super Drawable> transition) {
//这里可以做复杂的图片变换处理,如下只是简单的显示在imageView上
imageView.setImageDrawable(resource);
}
}; public void loadImage(View view) {
Glide.with(this)
.load(url)
.into(simpleTarget);
}
preload预加载
提前对图片进行一个预加载,等真正需要加载图片的时候就直接从缓存中读取
Glide.with(this)
.load("http://www.baidu.com/a.png")
.preload(); //预加载图片 Glide.with(this)
.load("http://www.baidu.com/a.png")
.into(imageView); //当需要加载此url时,会先从缓存里读取图片
缓存机制
Glide有两种缓存机制,一个是内存缓存,一个是硬盘缓存。内存缓存的主要作用是防止应用重复将图片数据读取到内存当中,而硬盘缓存的主要作用是防止应用重复从网络或其他地方重复下载和读取数据
默认情况下,Glide自动就是开启内存缓存的,这样无疑就可以大幅度提升图片的加载效率
内存缓存
默认是开启,除非特殊情况可以关闭
RequestOptions options = new RequestOptions()
.skipMemoryCache(true); //禁用内存缓存
Glide.with(this)
.load(url)
.apply(options)
.into(imageView);
硬盘缓存
RequestOptions options = new RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.NONE); //禁用硬盘缓存
Glide.with(this)
.load(url)
.apply(options)
.into(imageView);
- DiskCacheStrategy.NONE: 表示不缓存任何内容
- DiskCacheStrategy.DATA: 表示只缓存原始图片
- DiskCacheStrategy.RESOURCE: 表示只缓存转换过后的图片
- DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片
- DiskCacheStrategy.AUTOMATIC: 表示让Glide根据图片资源智能地选择使用哪一种缓存策略(默认选项)
只从缓存加载图片
GlideApp.with(this)
.load(url)
.onlyRetrieveFromCache(true)
.into(imageView);
清除缓存
Glide.get(this).clearMemory(); //清理内存缓存 new Thread(new Runnable() {
@Override
public void run() {
Glide.get(MainActivity.this).clearDiskCache(); //清理磁盘缓存
}
}).start();
Glide Transformations
是为Glide做图片变换的一个库
添加依赖
compile 'jp.wasabeef:glide-transformations:3.0.1'
变换效果
模糊处理
.apply(bitmapTransform(new BlurTransformation(80))) //模糊度 圆角图片
.apply(bitmapTransform(new RoundedCornersTransformation(50, 0, RoundedCornersTransformation.CornerType.ALL))) //第一个参数越大圆角越大 圆形图片
.apply(bitmapTransform(new CropCircleTransformation()))
正方形图片
.apply(bitmapTransform(new CropSquareTransformation()))
颜色叠加
.apply(bitmapTransform(new ColorFilterTransformation(0x7900CCCC)))
黑白图片
.apply(bitmapTransform(new GrayscaleTransformation()))
自定义裁剪
.apply(bitmapTransform(new CropTransformation( 600, 200, CropTransformation.CropType.CENTER)))
GitHub地址
更多效果,可以看源码:
GPUImage的滤镜
添加依赖
compile 'jp.co.cyberagent.android.gpuimage:gpuimage-library:1.4.1'
滤镜效果
对比
.apply(bitmapTransform(new ContrastFilterTransformation(3F))) 失真
.apply(bitmapTransform(new InvertFilterTransformation())) 亮度
.apply(bitmapTransform(new BrightnessFilterTransformation( 0.5F)))
陈旧
.apply(bitmapTransform(new SepiaFilterTransformation( 1.0F))) 马赛克
.apply(bitmapTransform(new PixelationFilterTransformation(20F))) 素描画
.apply(bitmapTransform(new SketchFilterTransformation())) 扭曲
.apply(bitmapTransform(new SwirlFilterTransformation(1.0F, 0.4F, new PointF(0.5F, 0.5F))))
//radius 旋转半径[0.0F,1.0F] 单参构造器 - 默认0.5F
// angle 角度[0.0F,无穷大单参构造器 - 默认1.0F视图表现为旋转圈数
// center 旋转中心点 单参构造器 - 默认new PointF(0.5F,0.5F) 装饰
.apply(bitmapTransform(new VignetteFilterTransformation(new PointF(0.5F, 0.5F), new float[]{0.0F, 0.0F, 0.0F}, 0.0F, 0.5F)))
// center 装饰中心 单参构造器 - 默认new PointF(0.5F, 0.5F)
// color 颜色组合 单参构造器 - 默认new float[0.0F,0.0F,0.0F] 3个颜色值分别对应RGB3种颜色,取值范围都为[0.0F,1.0F]
// start 起始点 单参构造器 - 默认0.0F
// end 终止点 单参构造器 - 默认0.75F
MultiTransformation
MultiTransformation对象可以存放多种效果
MultiTransformation multi = new MultiTransformation(
new BlurTransformation(25),
new RoundedCornersTransformation(128, 0, RoundedCornersTransformation.CornerType.ALL)); //模糊加圆角效果的对象 Glide.with(this)
.load(url)
.apply(bitmapTransform(multi))
.into(imageView);
Glide的混淆
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
} # for DexGuard only
-keepresourcexmlelements manifest/application/meta-data@value=GlideModule
Android 图片加载框架 Glide4.x的更多相关文章
- Android 图片加载框架Glide4.0源码完全解析(二)
写在之前 上一篇博文写的是Android 图片加载框架Glide4.0源码完全解析(一),主要分析了Glide4.0源码中的with方法和load方法,原本打算是一起发布的,但是由于into方法复杂性 ...
- Android 图片加载框架Glide4.0源码完全解析(一)
写在之前 上一篇博文写的是Picasso基本使用和源码完全解析,Picasso的源码阅读起来还是很顺畅的,然后就想到Glide框架,网上大家也都推荐使用这个框架用来加载图片,正好我目前的写作目标也是分 ...
- Android 图片加载框架 Glide 的用法
https://github.com/bumptech/glide Android图片加载框架最全解析(一),Glide的基本用法http://blog.csdn.net/guolin_blog/ar ...
- Android图片加载框架最全解析(八),带你全面了解Glide 4的用法
本篇将是我们这个Glide系列的最后一篇文章. 其实在写这个系列第一篇文章的时候,Glide就推出4.0.0的RC版了.那个时候因为我一直研究的都是Glide 3.7.0版本,再加上RC版本还不太稳定 ...
- Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能
我们的Glide系列文章终于要进入收尾篇了.从我开始写这个系列的第一篇文章时,我就知道这会是一个很长的系列,只是没有想到竟然会写这么久. 在前面的六篇文章中,我们对Glide的方方面面都进行了学习,包 ...
- Android图片加载框架最全解析(六),探究Glide的自定义模块功能
不知不觉中,我们的Glide系列教程已经到了第六篇了,距离第一篇Glide的基本用法发布已经过去了半年的时间.在这半年中,我们通过用法讲解和源码分析配合学习的方式,将Glide的方方面面都研究了个遍, ...
- Android图片加载框架最全解析(五),Glide强大的图片变换功能
大家好,又到了学习Glide的时间了.前段时间由于项目开发紧张,再加上后来又生病了,所以停更了一个月,不过现在终于又可以恢复正常更新了.今天是这个系列的第五篇文章,在前面四篇文章的当中,我们已经学习了 ...
- Android图片加载框架最全解析(四),玩转Glide的回调与监听
大家好,今天我们继续学习Glide. 在上一篇文章当中,我带着大家一起深入探究了Glide的缓存机制,我们不光掌握了Glide缓存的使用方法,还通过源码分析对缓存的工作原理进行了了解.虽说上篇文章和本 ...
- Android图片加载框架最全解析(三),深入探究Glide的缓存机制
在本系列的上一篇文章中,我带着大家一起阅读了一遍Glide的源码,初步了解了这个强大的图片加载框架的基本执行流程. 不过,上一篇文章只能说是比较粗略地阅读了Glide整个执行流程方面的源码,搞明白了G ...
随机推荐
- 最快效率求出乱序数组中第k小的数
题目:以尽量高的效率求出一个乱序数组中按数值顺序的第k 的元素值 思路:这里很容易想到直接排序然后顺序查找,可以使用效率较高的快排,但是它的时间复杂度是O(nlgn),我们这里可以用一种简便的方法,不 ...
- Android端IM应用中的@人功能实现:仿微博、QQ、微信,零入侵、高可扩展
本文由“猫爸iYao”原创分享,感谢作者. 1.引言 最近有个需求:评论@人(没错,就是IM聊天或者微博APP里的@人功能),就像下图这样: ▲ 微信群聊界面里的@人功能 ▲ QQ群聊界面里 ...
- 推荐几个牛逼的 IDEA 插件,还带动图!
阅读本文大概需要 2.3 分钟. 作者:纪莫, cnblogs.com/jimoer 这里只是推荐一下好用的插件,具体的使用方法不一一详细介绍. JRebel for IntelliJ 一款热部署插件 ...
- IOS微信点击input弹出输入法,关闭后页面留白解决方案
场景:IOS用微信点击input框弹出输入法后 不管你是输入信息,还是不输入直接点完成关闭输入法,都会导致页面被挤上去后产生留白,从而改变页面布局 解决方法: 给input添加 ...
- [Swift]LeetCode961. 重复 N 次的元素 | N-Repeated Element in Size 2N Array
In a array A of size 2N, there are N+1 unique elements, and exactly one of these elements is repeate ...
- PHP算法之斐波那契数列(递归)
/*斐波那契数列 源代码分析 f(x) = 1 ; 当 x < 2 ; f(x) = f(x-1)+f(x-2); 当 x >= 2 ; 通项式为:fn ={((1+根号5)/2)^n-( ...
- SpringBoot 集成Mybatis 连接Mysql数据库
记录SpringBoot 集成Mybatis 连接数据库 防止后面忘记 1.添加Mybatis和Mysql依赖 <dependency> <groupId>org.mybati ...
- MySQL忘记密码后找回密码
停止mysql服务 在mysql配置文件里[mysqld]下添加skip-grant-tables 3.重启服务,进入mysql 4.修改密码: MariaDB [mysql]> update ...
- 决策树 Decision Tree
决策树是一个类似于流程图的树结构:其中,每个内部结点表示在一个属性上的测试,每个分支代表一个属性输出,而每个树叶结点代表类或类分布.树的最顶层是根结点.  决策树的构建 想要构建一个决策树,那么咱们 ...
- 十一之买一台 vps搭建 玩玩
直接上大家都熟悉的banwangong的网址买一台最便宜的机器,毕竟是试着玩么,买了一个月的,如果直接买还是冲年费的吧. 第一步,注册会员么,结果就出问题了,显示图片不符合标准 ,我就很纳闷,我填几个 ...