Glide 3 添加依赖 Glide OR glide-transformations 选其一
Glide
1 2 //Glide implementation 'com.github.bumptech.glide:glide:3.7.0'
glide-transformations
该库依赖于Glide,是处理图片的库,会自动下载Glide
1 2 3 //glide-transformations implementation 'jp.wasabeef:glide-transformations:3.1.1' implementation 'jp.co.cyberagent.android.gpuimage:gpuimage-library:1.4.1'
简单使用 1 Glide.with(this ).load(R.mipmap.touxiang).into(head_imageview);
设置圆角 引用
1 2 3 4 import com.bumptech.glide.Glideimport com.bumptech.glide.load.engine.DiskCacheStrategyimport com.bumptech.glide.request.RequestOptionsimport com.bumptech.glide.load.resource.bitmap.RoundedCorners
Kotlin
1 2 3 4 5 6 7 8 9 10 11 val roundedCorners = RoundedCorners(6 )var options = RequestOptions.bitmapTransform(roundedCorners) .override (180 , 180 ) .placeholder(R.mipmap.pic_error) .error(R.mipmap.pic_error) .diskCacheStrategy(DiskCacheStrategy.ALL) Glide.with(mContext) .load(BaseConfig.baseALiUrl + item.schoologo) .apply(options) .into(imageView)
禁用缓存 常用与更新用户头像,但是头像地址不变的情况
Kotlin
1 2 3 4 5 6 7 8 var options = RequestOptions() .centerCrop() .placeholder(R.drawable.shape_common_light_white_bg) .priority(Priority.HIGH).skipMemoryCache(true ) .diskCacheStrategy(DiskCacheStrategy.NONE) Glide.with(this ).load(pic) .apply(options) .into(head_imageview);
Glide 4 对比 相比于Glide 3
将配置全部设置到了一个RequestOptions里面,并使用apply方法,应用这些配置信息
添加一个compiler的库,这个库是用于生成Generated API的,可以简化方法的调用
引用 Min Sdk Version - 使用 Glide 需要 min SDK 版本 API 14 (Ice Cream Sandwich) 或更高。
Compile Sdk Version - Glide 必须使用 API 27 (Oreo MR1) 或更高版本的 SDK 来编译。
Support Library Version - Glide 使用的支持库版本为 27 。
如果你需要使用不同的支持库版本,你需要在你的 build.gradle 文件里去从 Glide 的依赖中去除 com.android.support。例如,假如你想使用 v26 的支持库:
1 2 3 4 5 6 dependencies { implementation ("com.github.bumptech.glide:glide:4.9.0" ) { exclude group: "com.android.support" } implementation "com.android.support:support-fragment:26.1.0" }
Java 1 2 3 4 dependencies { implementation 'com.github.bumptech.glide:glide:4.4.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.4.0' }
Kotlin 如果你在 Kotlin 编写的类里使用 Glide 注解,你需要引入一个 kapt 依赖,以代替常规的 annotationProcessor 依赖:
1 2 3 4 dependencies { implementation 'com.github.bumptech.glide:glide:4.4.0' kapt 'com.github.bumptech.glide:compiler:4.9.0' }
请注意,你还需要在你的 build.gradle 文件中包含 kotlin-kapt插件:
1 apply plugin: 'kotlin-kapt'
权限 1 2 3 4 5 6 7 8 9 10 11 12 <manifest xmlns:android ="http://schemas.android.com/apk/res/android" package ="your.package.name" <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" /> <application > </application > </manifest >
proguard 如果你有使用到 proguard,那么请把以下代码添加到你的 proguard.cfg 文件中:
1 2 3 4 5 6 7 8 9 10 -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.ImageHeaderParser$** { **[] $VALUES ; public *; } 如果你的 target API 低于 Android API 27,请添加: ```pro -dontwarn com.bumptech.glide.load.resource.bitmap.VideoDecoder
普通方式调用 加载图片 1 2 3 4 5 6 7 8 9 RequestOptions options = new RequestOptions () .placeholder(R.drawable.loading) .error(R.drawable.error) .override(200 , 100 ) .diskCacheStrategy(DiskCacheStrategy.NONE); Glide.with(this ) .load(url) .apply(options) .into(imageView);
缓存策略 Glide 4.x版本的缓存选项,有下面5种:
DiskCacheStrategy.NONE: 表示不缓存任何内容。
DiskCacheStrategy.DATA: 表示只缓存原始图片。
DiskCacheStrategy.RESOURCE: 表示只缓存转换过后的图片。
DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。
DiskCacheStrategy.AUTOMATIC: 表示让Glide根据图片资源智能地选择使用哪一种缓存策略(默认选项)。
Glide 3中的语法是先load()再asBitmap()的,而在Glide 4中是先asBitmap()再load()的
Glide 4中又新增了asFile()方法和asDrawable()方法,分别用于强制指定文件格式的加载和Drawable格式的加载
文件下载 Glide 4中又新增了submit()/submit(int width, int height)方法,这个方法其实就是对应的Glide 3中的downloadOnly()方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public void downloadImage () { new Thread (new Runnable () { @Override public void run () { try { String url = "http://www.guolin.tech/book.png" ; final Context context = getApplicationContext(); FutureTarget<File> target = Glide.with(context) .asFile() .load(url) .submit(); final File imageFile = target.get(); runOnUiThread(new Runnable () { @Override public void run () { Toast.makeText(context, imageFile.getPath(), Toast.LENGTH_LONG).show(); } }); } catch (Exception e) { e.printStackTrace(); } } }).start(); }
图片处理 Glide 4.x还提供了现成的图片转换的API:
1 2 3 RequestOptions options = new RequestOptions ().centerCrop();RequestOptions options = new RequestOptions ().fitCenter();RequestOptions options = new RequestOptions ().circleCrop();
如果需要使用一些特殊转换,需要调用
1 RequestOptions options = new RequestOptions ().transform();
配合下面这个库:
1 2 3 dependencies { implementation 'jp.wasabeef:glide-transformations:3.0.1' }
就可以进行方便的进行图片转换。使用示例如下:
1 2 3 4 5 6 7 String url = "https://up.sc.enterdesk.com/edpic/cf/3e/84/cf3e8415383e065b0fe8938f73bedf70.jpg" ;RequestOptions options = new RequestOptions () .transforms(new BlurTransformation (), new GrayscaleTransformation ()); Glide.with(this ) .load(url) .apply(options) .into(imageView);
GlideApp方式调用 Generated API是Glide 4中全新引入的一个功能,它的工作原理是使用注解处理器 (Annotation Processor ) 来生成出一个API,在Application模块中可使用该流式API一次性调用到RequestBuilder,RequestOptions和集成库中所有的选项。
简单说,就是Glide 4仍然给我们提供了一套和Glide 3一模一样的流式API接口,照顾老版本的用户的使用习惯。
只不过需要把Glide 关键字替换成GlideApp 关键字。
如下所示:
1 2 3 4 5 6 7 8 9 GlideApp.with(this ) .load(url) .placeholder(R.drawable.loading) .error(R.drawable.error) .skipMemoryCache(true ) .diskCacheStrategy(DiskCacheStrategy.NONE) .override(Target.SIZE_ORIGINAL) .circleCrop() .into(imageView);
不过,有可能你的IDE中会提示找不到GlideApp这个类。这个类是通过编译时注解自动生成的,但是要先先准备代码中,有一个自定义的模块,并给这个模块加上 @GlideModule 注解。如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 @GlideModule public class MyAppGlideModule extends AppGlideModule { @Override public void applyOptions (Context context, GlideBuilder builder) { } @Override public void registerComponents (Context context, Glide glide, Registry registry) { } }
然后在Android Studio中点击菜单栏Build => Rebuild Project,GlideApp这个类就会自动生成了。
自定义API 下面我来具体举个例子
比如说我们要求项目中所有图片的缓存策略全部都要缓存原始图片,那么每次在使用Glide加载图片的时候,都去指定diskCacheStrategy(DiskCacheStrategy.DATA)这么长长的一串代码,确实是让人比较心烦。
这种情况我们就可以去定制一个自己的API了,定制自己的API需要借助 @GlideExtension 和 @GlideOption这两个注解。创建一个我们自定义的扩展类
代码如下所示:
1 2 3 4 5 6 7 8 9 10 11 @GlideExtension public class MyGlideExtension { private MyGlideExtension () { } @GlideOption public static void cacheSource (RequestOptions options) { options.diskCacheStrategy(DiskCacheStrategy.DATA); } }
注意自定义API的方法都必须是静态方法,而且第一个参数必须是RequestOptions,后面你可以加入任意多个你想自定义的参数。在cacheSource()方法中,我们仍然还是调用的diskCacheStrategy(DiskCacheStrategy.DATA)方法,所以说cacheSource()就是 一层简化API的封装而已。
然后在Android Studio中点击菜单栏Build -> Rebuild Project,神奇的事情就会发生了,你会发现你已经可以使用这样的语句来加载图片了:
1 2 3 4 GlideApp.with(this ) .load(url) .cacheSource() .into(imageView);