概述

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地址

更多效果,可以看源码:

Glide Transformations

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的更多相关文章

  1. Android 图片加载框架Glide4.0源码完全解析(二)

    写在之前 上一篇博文写的是Android 图片加载框架Glide4.0源码完全解析(一),主要分析了Glide4.0源码中的with方法和load方法,原本打算是一起发布的,但是由于into方法复杂性 ...

  2. Android 图片加载框架Glide4.0源码完全解析(一)

    写在之前 上一篇博文写的是Picasso基本使用和源码完全解析,Picasso的源码阅读起来还是很顺畅的,然后就想到Glide框架,网上大家也都推荐使用这个框架用来加载图片,正好我目前的写作目标也是分 ...

  3. Android 图片加载框架 Glide 的用法

    https://github.com/bumptech/glide Android图片加载框架最全解析(一),Glide的基本用法http://blog.csdn.net/guolin_blog/ar ...

  4. Android图片加载框架最全解析(八),带你全面了解Glide 4的用法

    本篇将是我们这个Glide系列的最后一篇文章. 其实在写这个系列第一篇文章的时候,Glide就推出4.0.0的RC版了.那个时候因为我一直研究的都是Glide 3.7.0版本,再加上RC版本还不太稳定 ...

  5. Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能

    我们的Glide系列文章终于要进入收尾篇了.从我开始写这个系列的第一篇文章时,我就知道这会是一个很长的系列,只是没有想到竟然会写这么久. 在前面的六篇文章中,我们对Glide的方方面面都进行了学习,包 ...

  6. Android图片加载框架最全解析(六),探究Glide的自定义模块功能

    不知不觉中,我们的Glide系列教程已经到了第六篇了,距离第一篇Glide的基本用法发布已经过去了半年的时间.在这半年中,我们通过用法讲解和源码分析配合学习的方式,将Glide的方方面面都研究了个遍, ...

  7. Android图片加载框架最全解析(五),Glide强大的图片变换功能

    大家好,又到了学习Glide的时间了.前段时间由于项目开发紧张,再加上后来又生病了,所以停更了一个月,不过现在终于又可以恢复正常更新了.今天是这个系列的第五篇文章,在前面四篇文章的当中,我们已经学习了 ...

  8. Android图片加载框架最全解析(四),玩转Glide的回调与监听

    大家好,今天我们继续学习Glide. 在上一篇文章当中,我带着大家一起深入探究了Glide的缓存机制,我们不光掌握了Glide缓存的使用方法,还通过源码分析对缓存的工作原理进行了了解.虽说上篇文章和本 ...

  9. Android图片加载框架最全解析(三),深入探究Glide的缓存机制

    在本系列的上一篇文章中,我带着大家一起阅读了一遍Glide的源码,初步了解了这个强大的图片加载框架的基本执行流程. 不过,上一篇文章只能说是比较粗略地阅读了Glide整个执行流程方面的源码,搞明白了G ...

随机推荐

  1. Java面试题整理:这些Java程序员面试中经常遇见的题目,必须掌握才能有好结果

    1.是否可以从一个static方法内部发出对非static方法的调用? 不可以.因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时 ...

  2. 再谈反向传播(Back Propagation)

    此前写过一篇<BP算法基本原理推导----<机器学习>笔记>,但是感觉满纸公式,而且没有讲到BP算法的精妙之处,所以找了一些资料,加上自己的理解,再来谈一下BP.如有什么疏漏或 ...

  3. [Swift]LeetCode34. 在排序数组中查找元素的第一个和最后一个位置 | Find First and Last Position of Element in Sorted Array

    Given an array of integers nums sorted in ascending order, find the starting and ending position of ...

  4. mysql tablespace(独立表空间)超速备份大数据

    前序 对于用户自主创建的表,会采用此种模式,每个表由一个独立的表空间进行管理备份(速度相当的猛) 首先介绍一下文件 .ibd就被称之为独立表空间的数据文件 .frm就是元数据文件 就是创建表后生成的 ...

  5. socket编程: TypeError: must be bytes or buffer, not str

    先看一段代码 #!/usr/bin/env python3 from socket import * serverName = "10.10.10.132" serverPort ...

  6. Mongodb~Linux环境下的部署

    < mongodb服务脚本的制作> Mongodb这个文档型非关系型数据库,可以说它是最像关系型的了,之前大叔主要讲如何使用mongodb,而没有说过如何去部署和安装它,而今天大叔有必要讲 ...

  7. ThreadPoolExecutor系列二——ThreadPoolExecutor 代码流程图

    ThreadPoolExecutor 代码流程图 本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7681648.ht ...

  8. ldap配置系列二:jenkins集成ldap

    ldap配置系列二:jenkins集成ldap jenkins简介 jenkins是一个独立的.开放源码的自动化服务器,它可以用于自动化与构建.测试.交付或部署软件相关的各种任务. jenkins官方 ...

  9. python学习第二讲,pythonIDE介绍以及配置使用

    目录 python学习第二讲,pythonIDE介绍以及配置使用 一丶集成开发环境IDE简介,以及配置 1.简介 2.PyCharm 介绍 3.pycharm 的安装 二丶IDE 开发Python,以 ...

  10. 【Node.js】利用node.js搭建服务器并访问静态网页

    node.js是一门服务端的语言,下面讲讲如何利用node.js提供给我们的api来搭建服务器,并且访问静态网页 项目结构如下 ------------------------------------ ...