Glide v4 用法
来源:互联网 发布:鸟哥linux基础篇 视频 编辑:程序博客网 时间:2024/06/05 03:46
设置Gradle
repositories { mavenCentral() maven { url 'https://maven.google.com' }}dependencies { compile 'com.github.bumptech.glide:glide:4.1.1' annotationProcessor 'com.github.bumptech.glide:compiler:4.1.1'}
Maven
<dependency> <groupId>com.github.bumptech.glide</groupId> <artifactId>glide</artifactId> <version>4.1.1</version> <type>aar</type></dependency><dependency> <groupId>com.google.android</groupId> <artifactId>support-v4</artifactId> <version>r7</version></dependency><dependency> <groupId>com.github.bumptech.glide</groupId> <artifactId>compiler</artifactId> <version>4.1.1</version> <optional>true</optional></dependency>
Proguard 混淆
-keep public class * implements com.bumptech.glide.module.GlideModule-keep public class * extends com.bumptech.glide.AppGlideModule-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { **[] $VALUES; public *;}
Kotlin
dependencies { kapt 'com.github.bumptech.glide:compiler:4.1.1'}
简单用法,和之前版本没区别
Glide.with(fragment) .load(myUrl) .into(imageView);
取消已下载的图片:
Glide.with(fragment).clear(imageView);
注:当Activity或Fragment被销毁时,Glide会自动清理缓存。clear 在ListView/RecycleView中需要替换图片的时候可以用上。
引用GlideApp:
自定义类继承AppGlideModule,package中会自动生成GlideApp类,然后我们就可以用GlideApp.with()代替Glide.with()了
package com.example.myapp;import com.bumptech.glide.annotation.GlideModule;import com.bumptech.glide.module.AppGlideModule;@GlideModulepublic final class MyAppGlideModule extends AppGlideModule {}
GlideApp.with(fragment) .load(myUrl) .fitCenter() .into(imageView);
placeHolder占位图:图片未加载时显示
GlideApp.with(fragment) .load(url) .placeholder(R.drawable.placeholder) //.placeholder(new ColorDrawable(Color.BLACK)) .into(view);
error:图片加载失败时显示
GlideApp.with(fragment) .load(url) .error(R.drawable.error) //.error(new ColorDrawable(Color.RED)) .into(view);
fallback:url/model为null时显示
GlideApp.with(fragment) .load(url) .fallback(R.drawable.fallback) //.fallback(new ColorDrawable(Color.GREY)) .into(view);
RequestOptions 可添加四种参数: Placeholders、Transformations、Caching Strategies 以及组件特定的选项(编码质量,Bitmap解码设置)
Glide.with(fragment) .load(url) .apply(centerCropTransform(context)) .into(imageView);、RequestOptions cropOptions = new RequestOptions().centerCrop(context);...Glide.with(fragment) .load(url) .apply(cropOptions) .into(imageView);
注:RequestOptions可以被共享,apply()也可以多次调用,如果两个RequestOptions包含冲突设置,则后一个会覆盖前一个。
TransitionOptions 可添加三种参数:View淡入、交叉淡入淡出、没有任何效果:
Glide.with(fragment) .load(url) .transition(DrawableTransitionOptions.withCrossFade())//淡入淡出 .into(view);
注: TransitionOptions分为 BitmapTransitionOptions 和
DrawableTransitionOptions
RequestBuilder:用来整合options,图片的类型(Drawable/Bitmap)、url/model、需加载资源的view、RequestOption、TransitionOptions、thumbnail()
RequestBuilder<Drawable> requestBuilder = Glide.with(fragment);requestBuilder.apply(requestOptions);requestBuilder.transition(transitionOptions);RequestOptions options = new RequestOptions();options.centerCrop();Glide.with(fragment) .load(url) .apply(options) .into(imageView);
RequestBuilders可以被重复使用
RequestBuilder<Drawable> requestBuilder = Glide.with(fragment) .asDrawable() .apply(requestOptions);for (int i = 0; i < numViews; i++) { ImageView view = viewGroup.getChildAt(i); String url = urls.get(i); requestBuilder.load(url).into(view);}Transformations: CenterCrop、FitCenter、CircleCropGlide.with(fragment) .load(url) .apply(options)//RequestOptions .apply(fitCenterTransform())//静态方法 .fitCenter()//generated API .into(imageView);
Targets:glide 的回调 ,封装了当图片请求完成后会调用的方法
@Override public void onResourceReady(Object resource, Transition transition) { } @Override public void getSize(SizeReadyCallback cb) { } @Override public void removeCallback(SizeReadyCallback cb) { }
Target<Bitmap> target = Glide.with(fragment) .asBitmap() .load(url) .into(imageView);...// 记得clearGlide.with(fragment).clear(target);
自定义target:
简单的作为实例变量
private class WidgetHolder { private final Fragment fragment; private final Target<Widget> widgetTarget; public WidgetHolder(Fragment fragment, Widget widget) { this.fragment = fragment; widgetTarget = new CustomWidgetTarget(widget); } public void showInWidget(Uri uri) { Glide.with(fragment) .load(uri) .into(widgetTarget); }}
注:
- Glide能够使用getRequest()和setRequest()方法查找和取消对Targets的请求。所以可以继承BaseTarget.
- Glide优先使用由Targets提供的getSize()大小作为请求的目标大小
Transformations转换:
CenterCrop:缩放图像,使图像的宽度与给定的宽度匹配,并且图像的高度大于给定的高度,反之亦然,然后裁剪较大的尺寸以匹配给定的尺寸。不保持图像的纵横比
FitCenter:使图像均匀(保持图像的纵横比),使图像的尺寸之一等于给定的尺寸,另一个将小于给定的尺寸。
CircleCrop:,绕圈裁剪一个图像,所产生的图像被蒙上一个圆圈
RequestOptions options = new RequestOptions();options.centerCrop();Glide.with(fragment) .load(url) .apply(options) .into(imageView);
import static com.bumptech.glide.request.RequestOptions.fitCenterTransform;Glide.with(fragment) .load(url) .apply(fitCenterTransform()) .into(imageView);
GlideApp.with(fragment) .load(url) .fitCenter() .into(imageView);
Mutiple Transformations :多重转换按顺序执行
Glide.with(fragment) .load(url) .transform(new MultiTransformation(new FitCenter(), new YourCustomTransformation()) .into(imageView); 或 GlideApp.with(fragment) .load(url) .transforms(new FitCenter(), new YourCustomTransformation()) .into(imageView);
注:
- 最好创建Transformation一次,然后将其传递给多个加载。
- glide会根据图片的比例类型(如:FIT_CENTER、CENTER_INSIDE)自动转换
- 适用Bitmap Transformations于BitmapDrawable,GifDrawable和Bitmap
Transitions 动画:
- 单次网络请求中占位图与加载图的转变或图片尺寸的转变。
- 与v3不同,v4没有默认转变,每次请求都要定义。
- 如果从Glide的内存缓存中加载数据,则Glide的内置转换不会运行。但是,如果从Glide的磁盘缓存,本地源文件或Uri或远程源Url或Uri加载数据,则Glide的内置转换将会运行。如果要改变可自定义transition。
- 使用动画会使加载看起来缓慢,应尽量避免在列表时使用动画,必须要用时使用预加载
Configuration:为了使Glide的配置正常工作,库和应用程序需要执行一定步骤。不注册其他组件的库不需要这样做。
Libraries():
- 添加一个或多个LibraryGlideModule实现。
- 将@GlideModule注释添加到每个LibraryGlideModule实现
- 在Glide的注释处理器上添加依赖关系。
以okhttp为例:
@GlideModulepublic final class OkHttpLibraryGlideModule extends LibraryGlideModule { @Override public void registerComponents(Context context, Glide glide, Registry registry) { registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory()); }}
使用@GlideModule注释需要依赖于Glide的注释:
compile 'com.github.bumptech.glide:annotations:4.1.1'
Applications:
- 添加一个AppGlideModule实现
- 可选地,添加一个或多个LibraryGlideModule实现。
- 将@GlideModule注释添加到AppGlideModule和所有LibraryGlideModule。
- 在Glide的注释处理器上添加依赖关系。
- 为AppGlideModules添加混淆。
glidesamples有个Flickr的例子:
@GlideModulepublic class FlickrGlideModule extends AppGlideModule { @Override public void registerComponents(Context context, Glide glide, Registry registry) { registry.append(Photo.class, InputStream.class, new FlickrModelLoader.Factory()); }}
注释依赖:
compile 'com.github.bumptech.glide:annotations:4.1.1'annotationProcessor 'com.github.bumptech.glide:compiler:4.1.1'
混淆添加到proguard.cfg:
-keep public class * extends com.bumptech.glide.module.AppGlideModule-keep class com.bumptech.glide.GeneratedAppGlideModuleImpl
Glide允许应用程序通过实现AppGlideModule来完全控制Glide的内存和磁盘缓存的使用。
自定义内存缓存:LruResourceCache是MemoryCache的默认实现interface,LruResourceCache通过MemorySizeCalculator这个检查设备内存的类来确定size。
@GlideModulepublic class YourAppGlideModule extends AppGlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { MemorySizeCalculator calculator = new MemorySizeCalculator.Builder(context) .setMemoryCacheScreens(2) .build(); builder.setMemoryCache(new LruResourceCache(calculator.getMemoryCacheSize())); }}//or 直接覆盖缓存大小@GlideModulepublic class YourAppGlideModule extends AppGlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { int memoryCacheSizeBytes = 1024 * 1024 * 20; // 20mb builder.setMemoryCache(new LruResourceCache(memoryCacheSizeBytes)); }}//or 自己实现MemoryCache@GlideModulepublic class YourAppGlideModule extends AppGlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { builder.setMemoryCache(new YourAppMemoryCacheImpl()); }}
磁盘缓存:DiskLruCacheWrapper默认磁盘缓存大小为250 MB,并放置在应用程序的缓存文件夹中的特定目录中。
改成外部磁盘存储:
@GlideModulepublic class YourAppGlideModule extends AppGlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { builder.setDiskCache(new ExternalDiskCacheFactory(context)); }}
改变磁盘大小:
@GlideModulepublic class YourAppGlideModule extends AppGlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { int diskCacheSizeBytes = 1024 * 1024 * 100; // 100 MB builder.setDiskCache(new InternalDiskCacheFactory(context, diskCacheSizeBytes)); }}
更改存储文件夹名:
@GlideModulepublic class YourAppGlideModule extends AppGlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { int diskCacheSizeBytes = 1024 * 1024 * 100; // 100 MB builder.setDiskCache( new InternalDiskCacheFactory(context, "cacheFolderName", diskCacheSizeBytes)); }}
设置默认requestoptions
@GlideModulepublic class YourAppGlideModule extends AppGlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { builder.setDefaultRequestOptions( new RequestOptions() .format(DecodeFormat.RGB_565) .disallowHardwareBitmaps()); }}
注:有冲突设置,builder中的option会被覆盖
为activity或fragment单独设置默认requestoptions:
Glide.with(fragment) .applyDefaultRequestOptions( new RequestOptions() .format(DecodeFormat.RGB_565) .disallowHardwareBitmaps());
注册组件:
1. ModelLoader加载自定义模型(Urls,Uris,任意POJO)和Data(InputStreams,FileDescriptors)。
2. ResourceDecoder以解码新的资源(Drawables,Bitmaps)或新类型的数据(InputStreams,FileDescriptors)。
3. Encoders将Data(InputStreams,FileDescriptors)写入Glide的磁盘缓存。
4. ResourceTranscoder将资源(BitmapResource)转换为其他类型的资源(DrawableResource)。
5. ResourceEncoder将资源(BitmapResource,DrawableResource)写入Glide的磁盘缓存。
@GlideModulepublic class YourAppGlideModule extends AppGlideModule { @Override public void registerComponents(Context context, Glide glide, Registry registry) { registry.append(...); }}//or@GlideModulepublic class YourLibraryGlideModule extends LibraryGlideModule { @Override public void registerComponents(Context context, Glide glide, Registry registry) { registry.append(...); }}
例:一个可以获取新的自定义Model对象的InputStream的ModelLoader
//append()将确保你的的ModelLoader或ResourceDecoder仅在Glide的默认值尝试之后才会调用。@GlideModulepublic class YourAppGlideModule extends AppGlideModule { @Override public void registerComponents(Context context, Glide glide, Registry registry) { registry.append(Photo.class, InputStream.class, new CustomModelLoader.Factory()); }}//prepend()将确保你的ModelLoader或ResourceDecoder在所有其他先前注册的组件之前被调用,并且可以先运行。@GlideModulepublic class YourAppGlideModule extends AppGlideModule { @Override public void registerComponents(Context context, Glide glide, Registry registry) { registry.prepend(String.class, InputStream.class, new CustomUrlModelLoader.Factory()); }}//replace()完全替代Glide的默认行为并确保它不会运行。适用于像OkHttp或Volley这样的库来交换Glide的网络逻辑@GlideModulepublic class YourAppGlideModule extends AppGlideModule { @Override public void registerComponents(Context context, Glide glide, Registry registry) { registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory()); }}
冲突排除:
@Excludes({com.example.unwanted.GlideModule.class, com.example.conflicing.GlideModule.class})@GlideModulepublic final class MyAppGlideModule extends AppGlideModule { }
注:从Glide v3迁移过程中,可以将其用于排除LibraryGlideModules旧版和旧版的GlideModule实现。
Glide v4可以完全禁用清单解析。这样做可以改善Glide的初始启动时间,并避免尝试分析元数据时出现一些潜在的问题。
@GlideModulepublic final class MyAppGlideModule extends AppGlideModule { @Override public boolean isManifestParsingEnabled() { return false; }}
Caching 高速缓存:默认情况下,Glide会在启动对图像的新请求之前检查多层缓存:
- 活跃资源 - 此图像是否显示在另一个视图中?
- 内存缓存 - 这张图像最近是否加载并仍在内存中?
- 资源 - 此图像是否已经被解码,转换和写入磁盘缓存之前?
- 数据 - 此图像是否从写入磁盘缓存获取的数据?
前两个步骤检查资源是否在内存中,如果是,请立即返回图像。第二个步骤检查图像是否在磁盘上,并快速返回,但异步。
如果所有四个步骤都找不到图像,则Glide将返回原始来源以检索数据(原始文件,Uri,Url等)。
磁盘缓存策略:默认为DiskCacheStrategy.AUTOMATIC,加载远程数据时,只存储原始数据,加载本地数据时,存储缩略图。DiskCacheStrategy有五种值:
DiskCacheStrategy.ALL 使用DATA和RESOURCE缓存远程数据,仅使用RESOURCE来缓存本地数据。
DiskCacheStrategy.NONE 不使用磁盘缓存
DiskCacheStrategy.DATA 将原始数据写入磁盘缓存
DiskCacheStrategy.RESOURCE 在资源解码后将数据(缩略图)写入磁盘缓存。
DiskCacheStrategy.AUTOMATIC 根据原始图片数据和资源编码策略来自动选择磁盘缓存策略。
GlideApp.with(fragment) .load(url) .diskCacheStrategy(DiskCacheStrategy.ALL) .into(imageView);
只从缓存加载
GlideApp.with(fragment) .load(url) .onlyRetrieveFromCache(true) .into(imageView);
跳过缓存加载
GlideApp.with(fragment) .load(url) .skipMemoryCache(true)//跳过内存缓存 .diskCacheStrategy(DiskCacheStrategy.NONE)//跳过磁盘缓存 .into(view);
暂时允许Glide在应用的某些部分使用更多或更少的内存:
Glide.get(context).setMemoryCategory(MemoryCategory.LOW);// Or:Glide.get(context).setMemoryCategory(MemoryCategory.HIGH);//离开后需重新设置内存Glide.get(context).setMemoryCategory(MemoryCategory.NORMAL);
清除内存缓存
// This method must be called on the main thread.Glide.get(context).clearMemory();
清除磁盘缓存
new AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { // This method must be called on a background thread. Glide.get(applicationContext).clearDiskCache(); return null; }}
Debugging:
Glide.with(fragment) .load(url) .listener(new RequestListener() { @Override boolean onLoadFailed(@Nullable GlideException e, Object model, Target<R> target, boolean isFirstResource) { // Log errors here. } @Override boolean onResourceReady(R resource, Object model, Target<R> target, DataSource dataSource, boolean isFirstResource) { // Log successes here or use DataSource to keep track of cache hits and misses. } }) .into(imageView);
- Glide v4 用法
- Glide最新版V4使用指南
- Glide v4 GlideApp
- Glide v4详解
- Glide v4 知识点总结
- Glide V4源码解析
- Glide最新版V4使用指南
- Glide V4的封装使用
- Glide用法
- Glide用法
- Glide用法
- Glide从V3到V4的探索
- Glide从V3到V4的探索
- TinyMCE v4用法
- GLIDE 的 一些用法
- Android Glide简单用法
- Android Glide的用法
- Glide用法---学习笔记
- JDK的命令行工具
- java编程规范,编写良好的java程序
- 九度[1091]-棋盘游戏
- 求取离散点的曲率
- 用封装实现两个数相加结果实现
- Glide v4 用法
- 测试用例编写注意事项和编写方法
- 插序计Spider.Financial.NumXL.v1.65.42892.1.Win32_64 2CD确准
- LeetCode8. String to Integer (atoi)
- 求一个序列的最大连续长度
- 无线网络覆盖
- jQuery中全选和反选
- 欢迎使用CSDN-markdown编辑器
- HTML5中本地存储与本地数据库