这篇文章将是我们格莱德系列的最后一篇文章。

事实上,在撰写本系列的第一篇文章时,Glide发布了4.0.0的RC版本。当时因为一直在学习Glide 3.7.0版本,而RC版本不稳定,所以整个系列都是基于3 . 7 . 0写的。

现在,最新版本的Glide已经达到4.4.0。可以说Glide 4已经相当成熟稳定了。除此之外,朋友们不停的留言,他们想让我说说Glide 4的用法,因为与Glide 3相比,Glide 4似乎变化很大。学了Glide 3,用了Glide 4,发现根本用不上。

好了,让我们以文章《带你全面了解Glide 4的用法》为这个Glide系列画上一个圆满的句号。

Glide 4概述

如前所述,有朋友认为Glide 4相比Glide 3有了很大的变化,其实不然。之所以大家会有这种错觉,是因为你直接把Glide 3的用法移到了Glide 4,ide完全报错了,然后大家可能会觉得Glide 4的用法完全变了。

其实Glide 4和Glide 3相比变化不大,只是你还没有理解它的变化规律。一旦你掌握了格莱德4的变化规律,你会发现格莱德3的大部分用法在格莱德4中仍然是通用的。

在对Glide 4做了一个大概的研究之后,我发现Glide 4并不是一个突破性的升级,更多的是一个整洁的API优化。与Glide 3的API相比,Glide 4进行了更加科学合理的调整,提高了可读性、易写性和可扩展性。但是如果你已经熟悉了Glide 3,就不用切换到Glide 4了,因为在Glide 4上可以实现的Glide 3也可以实现,而且Glide 4在性能上没有提升。

但是对于初学Glide的人来说,没有必要学Glide 3,入门Glide 4是最好的选择。

好了,在对Glide 4做了一个基本的概述之后,我们就开始正式学习它的用法了。就像我刚才说的,Glide 4的用法和Glide 3相比没有太大变化。在前面的七篇文章中,我们已经学习了Glide 3的基本用法,缓存机制、回调和监控、图像转换、自定义模块等。,所以今天这篇文章的目标很简单,就是要掌握如何在Glide 4上实现之前学过的所有功能,所以现在就开始吧。

开始

要使用Glide,我们需要首先将这个库引入我们的项目。创建一个新的Glide4Test项目,然后在app/build.gradle文件中添加以下依赖项:

依赖项{ implementation ' com . github . bumptech . glide:glide:4.4.0 ' annotationProcessor ' com . github . bumptech . glide:编译器:4 . 4 . 0 '

}

注意,与Glide 3相比,这里增加了一个编译器库,用来生成Generated API,后面会讲到。

另外,Glide中需要网络功能,所以你要在AndroidManifest.xml中声明网络权限:

& ltuses-permissionandroid:name = " Android . permission . INternet "/& gt;

就这么简单,然后我们就可以自由使用Glide中的任何功能了。

加载图片

现在我们来试试怎么用Glide加载图片。例如,这是一张图片的地址:

http://guolin.tech/book.png

然后我们想把这张图载入程序。

然后首先打开项目的布局文件,在布局中添加一个Button和一个ImageView,如下图所示:

& ltlinelayoutxmlns:Android = " http://schemas . Android . com/apk/RES/Android " Android:layout _ width = " match _ parent " Android:layout _ height = " match _ parent " Android:orientation = " vertical " & gt;& ltbutton Android:layout _ width = " wrap _ content " Android:layout _ height = " wrap _ content " Android:text = " Load Image " Android:OnClick = " Load Image "/& gt;& ltimageview Android:id = " @+id/image _ view " Android:layout _ width = " match _ parent " Android:layout _ height = " match _ parent "/& gt;

& lt/LinearLayout >

为了让用户在单击按钮时在ImageView上显示上一张图片,我们需要修改MainActivity中的代码,如下所示:

publicclass mainactivityextendsAppCompactivity { ImageView ImageView;@ overridedeprotectedvotioncreate(Bundle savedInstanceState){ super . oncreate(savedInstanceState);setContentView(r . layout . activity _ main);imageView =(imageView)findViewById(r . id . image _ view);} publicationloadimage(View View){ String URL = " http://gulin . tech/book . png "/>

可以看到网络上的一张图片已经成功下载并显示在ImageView上。

你会发现到目前为止,Glide 4的用法和Glide 3一模一样。事实上,核心代码只有这一行:

用(这个)滑行。加载(url)。进入(imageView);

它仍然是传统的三个步骤:首先用(),然后装入(),最后装入()。我在这篇关于Glide基本用法的文章中已经解释清楚了这一行代码的解释,这里就不赘述了。好了,现在你已经成功启动了Glide 4,让我们进一步了解一下Glide 4的用法。

占据位图

观察刚才加载网络镜像的效果,你会发现点击加载镜像按钮后,需要一段时间才能显示镜像。这个其实很好理解,因为从网上下载图片需要时间。那么有什么方法可以优化用户体验呢?当然,Glide提供了多种API支持,包括位图功能。

顾名思义,占用一个位图意味着在加载图像的过程中,我们首先显示一个临时图像,然后用要加载的图像来替换它。

让我们学习如何使用格莱德的位图功能。首先,我事先准备了一张loading.jpg的图片,以位图的形式显示出来。然后修改下滑加载部分的代码,如下所示:

请求选项选项=新请求选项()。占位符(r . draw able . loading);用(这个)滑行。加载(url)。应用(选项)。进入(imageView);

是的,就这么简单。在这里,我们首先创建一个RequestOptions对象,然后调用它的占位符()方法来指定占用位图,然后将占位符图像的资源id传递给这个方法。最后,在Glide的三个步骤之间添加apply()方法,以应用我们刚刚创建的RequestOptions对象。

但是,如果您现在重新运行代码并单击加载图像,您可能根本看不到位图效果。因为Glide有一个非常强大的缓存机制,我们刚才加载的时候Glide会自动缓存图片,下次加载的时候会直接从缓存中读取,不会再从网络上下载,所以加载速度非常快,显示位图可能来不及了。

因此,我们需要在这里做一点修改,给职业位图一个显示的机会。修改后的代码如下:

请求选项选项=新请求选项()。占位符。磁盘缓存策略(磁盘缓存策略。NONE);用(这个)滑行。加载(url)。应用(选项)。进入(imageView);

如您所见,在这里,一个磁盘缓存策略()方法连接在请求选项对象和磁盘缓存策略中。传入NONE参数,可以禁用Glide的缓存功能。

我们将在后面更详细地解释格莱德缓存。这只是测试位图功能的额外配置。暂时只需要知道禁用缓存必须这样写。

现在再次运行代码,效果如下图所示:

可以看到,当你点击Load Image按钮时,会立即显示一个占用位图,然后在加载真实图片后替换该占用位图。

除了这个负载占用位图,还有一个异常占用位图。异常占用位图是指如果由于某些异常情况导致图片加载失败,比如手机网络信号不好,此时就会显示这个异常占用位图。

相信你已经可以猜到异常占用位图的用法了。首先准备一张error.jpg的图片,然后修改下滑加载部分的代码,如下图:

请求选项选项=新请求选项()。占位符(r . draw able . IC _ launcher _ background)。错误(可绘制的错误)。磁盘缓存策略(磁盘缓存策略。NONE);用(这个)滑行。加载(url)。应用(选项)。进入(imageView);

很简单,这里串联一个error()方法来指定异常位图。

其实如果你熟悉Glide 3,相信你已经掌握了Glide 4的变化规律。在Glide 3中,占位符(),error(),diskCacheStrategy()等一系列API在Glide三步法中是直接串联的。

Glide 4引入了一个RequestOptions对象,它将这一系列的API移动到RequestOptions。这样做的好处是,我们可以去掉冗长的Glide加载语句,我们还可以封装自己的API,因为RequestOptions可以作为参数传递到方法中。

例如,您可以像这样编写一个Glide加载工具类:

publicClassGledItutil { publicstaticudioload(上下文上下文,字符串url,ImageView imageView,RequestOptions选项){ Glide.with(上下文)。加载(url)。应用(选项)。进入(imageView);} }

指定图片大小

其实在大多数情况下,我们在使用Glide的时候并不需要指定图片的大小,因为Glide会根据ImageView的大小自动确定图片的大小,以保证图片不会占用太多内存,造成OOM。

但是如果真的有这样的需求,就必须给图片指定一个固定的尺寸,Glide还是支持这个功能的。修改下滑加载部分的代码,如下所示:

请求选项选项=新请求选项()。超越(200,100);用(这个)滑行。加载(url)。应用(选项)。进入(imageView);

还是很简单,图片的大小在这里是用override()方法指定的。也就是说,Glide现在只加载200*100像素大小的图片,而不管您的ImageView的大小如何。

如果要加载图片的原始大小,可以使用关键字Target。尺寸_原始,如下所示:

请求选项选项=新请求选项()。覆盖(目标。SIZE _ ORIGINAL);用(这个)滑行。加载(url)。应用(选项)。进入(imageView);

这样,Glide将加载图片的原始大小,而不是自动压缩图片。当然,这种写作也会面临更高的OOM风险。

缓存机制

Glide的缓存设计可以说非常先进,考虑的场景也非常全面。在缓存的功能上,Glide将其分为两个模块,一个是内存缓存,一个是硬盘缓存。

这两个缓存模块具有不同的功能。内存缓存的主要功能是防止应用程序将图片数据重复读入内存,而硬盘缓存的主要功能是防止应用程序从网络或其他地方重复下载和读取数据。

内存缓存和硬盘缓存的结合构成了Glide出色的图片缓存效果,下面我们来学习一下如何分别使用这两个缓存。

首先,看一下内存缓存。

要知道,默认情况下,Glide会自动打开内存缓存。也就是说,当我们使用Glide加载一张图片时,图片会被缓存在内存中。只要不从内存中清除,下次我们使用Glide重新加载图片时,就直接从内存中读取,而不是从网络或硬盘中重新读取,这无疑会大大提高图片的加载效率。比如你在recycle view中反复上下滑动,recycle view中任何一张由Glide加载的图片都可以直接从内存中读取并快速显示出来,从而大大提高了用户体验。

Glide最人性化的地方在于,你可以自动享受这个极其方便的内存缓存功能,而无需编写任何额外的代码,因为Glide已经默认打开了。

那么现在这个功能已经默认开启了,还能谈什么用法呢?只有一点,如果你有什么特殊的原因要禁用内存缓存功能,格莱德为此提供了一个接口:

请求选项选项=新请求选项()。skipMemoryCache(true);用(这个)滑行。加载(url)。应用(选项)。进入(imageView);

如您所见,只需调用skipMemoryCache()方法并传入true,这意味着Glide的内存缓存功能被禁用。

接下来,我们开始学习硬盘缓存。

其实我们在刚学占用位图的功能的时候就用了硬盘缓存的功能。当时,以下代码用于禁止Glide在硬盘上缓存图片:

请求选项选项=新请求选项()。磁盘缓存策略(磁盘缓存策略。NONE);用(这个)滑行。加载(url)。应用(选项)。进入(imageView);

可以通过调用diskCacheStrategy()方法并传递DiskCacheStrategy来禁用Glide的硬盘缓存功能。没有

这个diskCacheStrategy()方法基本上就是Glide的硬盘缓存功能的一切,它可以接收五个参数:

DiskCacheStrategy。无:表示不缓存任何内容。

DiskCacheStrategy。数据:表示只缓存原始图片。

DiskCacheStrategy。RESOURCE:指示只缓存转换后的图片。

DiskCacheStrategy。全部:表示原始图片和转换后的图片都被缓存。

DiskCacheStrategy。自动:表示让格莱德根据图片资源智能选择使用哪种缓存策略(默认选项)。

其中磁盘缓存策略。数据对应于磁盘缓存策略。源和磁盘缓存策略。资源对应于磁盘缓存策略。下滑3的结果。DiskCacheStrategy。AUTOMATIC是Glide 4中的一个新的缓存策略,默认情况下使用,不指定diskCacheStrategy。

以上五个参数的解释并没有什么难以理解的,但是你可能需要了解一下转换图片的概念。也就是说,当我们使用Glide加载图片时,Glide会对图片进行压缩和转换,而不是默认显示原始图片(我们稍后会了解这一点)。简而言之,就是经过一系列运算后得到的图片,称为转换图片。

好了,Glide 4硬盘缓存就这些了。如果想了解更多关于Glide缓存的知识,可以参考“深入探索Glide缓存机制”一文。

指定加载格式

众所周知,Glide的一个突出功能就是可以加载GIF图片,但是同样是优秀的图片加载框架毕加索却不支持这个功能。

而且使用Glide加载GIF图片不需要编写任何额外的代码,Glide内部会自动判断图片格式。例如,我们将加载图片的网址更改为GIF图片,如下所示:

用(这个)滑行。load(" http://gulin . tech/test . gif ")。进入(imageView);

现在再次运行代码,效果如下图所示:

也就是说,无论我们传入的是普通图片还是GIF图片,Glide都会自动判断并正确解析显示。

但是如果我要指定加载格式呢?比如我希望加载的图片一定是静态图片,不需要Glide自动帮我判断是静态图片还是GIF图片。

要实现这个功能还是很简单的,我们只需要串联一个新的方法,如下所示:

用(这个)滑行。asBitmap()。load(" http://gulin . tech/test . gif ")。进入(imageView);

你可以看到在with()方法后面增加了一个asBitmap()方法,这意味着这里只允许加载静态图片,我们不需要Glide来帮助我们自动判断图片格式。如果您传入一张GIF图片,Glide将显示该GIF图片的第一帧,而不是播放它。

熟悉Glide 3的朋友肯定都很熟悉asBitmap()方法吧?但是不要以为这里没有陷阱。在Glide 3中,语法是先加载()然后加载位图(),而在Glide 4中,语法是先加载()然后加载()。乍一看,你可能分辨不出来,但写错顺序,肯定会报错。

所以同样的,既然我们可以强制加载静态图片,我们也可以强制加载动态图片。对应的方法是asGif()。在Glide 4中增加了asFile()方法和asDrawable()方法,分别用来强制加载指定的文件格式和Drawable格式。它们的用法比较简单,就不再演示了。

回拨和监控

回调和监控的内容稍微多一点,我们分四个部分来研究。

1.into()方法

我们都知道ImageView可以传入Glide的into()方法。那么into()方法可以传入其他参数吗?能否让Glide加载的图片不在ImageView上显示?答案是肯定的,这需要使用自定义的Target函数。

Glide中的Target是通用的,也是复杂的。让我简单演示一下SimpleTarget的用法。代码如下:

简单目标<。可提取>。简单目标=新简单目标& lt可提取>。(){ @ OverridePublicationResourceReady(可绘制资源,转换& lt?superDrawable & gt。过渡){ imageView.setImageDrawable(资源);} };publicvoidloadImage(视图视图){ Glide.with( this)。load(" http://gulin . tech/book . png "/>

这样就可以清楚的看到图片完整的缓存路径是什么。

4.listener()方法

其实listener()方法很常见,可以用来监控Glide加载图片的状态。比如我们只是用preload()方法来预加载图片,但是我怎么确定预加载是否完成?而且如果Glide加载图片失败,怎么调试错误原因?答案都在listener()方法中。

让我们来看看listener()方法的基本用法。与前面的方法不同,前面的方法都旨在替换into()方法,listener()与into()方法一起使用,它也可以与preload()方法一起使用。最基本的用法如下:

用(这个)滑行。load(" http://www . gulin . tech/book . png "/>

可以看出,现在显示的图片都是对原图进行循环切割得到的图片。

当然,除了使用内置的图像变换操作,我们还可以完全定制自己的图像变换操作。理论上,我们可以在画面变换的步骤中做任何事情,我们可以对画面做任何你想做的事情。包括圆整、圆角、黑化、模糊等。,甚至你可以完全用另一张图片代替原来的图片。

但是由于这一部分与Glide 3相比没有什么变化,就不再解释了。想学习自定义图像变换操作的朋友可以参考本文Glide强大的图像变换功能。

关于图像转换,最后,让我们看看一个优秀的开源库,glide-transformations。它实现了很多通用的图像变换效果,如裁剪变换、颜色变换、模糊变换等,使得我们可以方便地进行各种图像变换。

Glide-transformations项目主页地址为:

https://github.com/wasabeef/glide-transformations

让我们体验一下这个库的强大功能。首先,我们需要将这个库引入到我们的项目中,并在app/build.gradle文件中添加以下依赖项:

依赖项{实现' jp . wasabee:glide-transformations:3 . 0 . 1 '

}

我们可以对图片进行单次变换,也可以一起使用多种图片变换。比如我想同时模糊和黑化画面,可以这样写:

string URL = " http://gulin . tech/book . png "/>

当然,这只是glide-transformations Library的一小部分功能,你可以在它的GitHub项目主页上了解更多关于图像变换的效果。

自定义模块

自定义模块是Glide中的高级功能,也是难点部分。

在这里,我无法说出本文中定制模块的所有内容。由于篇幅所限,我只能说说Glide 4中的这部分改动。

用户自定义模块功能可以将改变Glide配置、更换Glide组件等操作分开,让我们可以轻松定制各种Glide配置,而不与Glide的图像加载逻辑有任何交集,这也是一种低耦合编程方法的体现。让我们学习如何实现定制模块。

首先,定义一个我们自己的模块类,让它从AppGlideModule继承,如下所示:

@ GlideModule

publicClassMyappGledModuledExtendsAppGledModule { @ overridePublicavityOptions(Context Context,GledBuilder builder){ } @ overridePublicavitRegisterComponents(Context Context,Gledge,registry){ } }

您可以看到,在MyAppGlideModule类中,我们重写了applyOptions()和registerComponents()方法,分别用于更改Glade配置和替换Glade组件。

注意,在MyAppGlideModule类中,我们添加了@GlideModule的注释,这是Gilde 4和Glide 3最大的区别。在Glide 3中,我们定义了一个自定义模块后,必须在AndroidManifest.xml文件中注册,才能生效,但是在Glide 4中,并不是必须的,因为@GlideModule这个注释可以让Glide识别这个自定义模块。

在这种情况下,我们将完成Glide自定义模块的功能。之后,您只需要向applyOptions()和registerComponents()方法添加特定的逻辑,然后就可以更改Glide配置或替换Glide组件。具体请参考文章《探索Glide的自定义模块功能》,这里就不讨论了。

使用生成的应用编程接口

生成API是Glide 4中引入的新功能。其工作原理是利用注释处理器生成一个API,可以在应用模块中使用,一次性调用RequestBuilder、RequestOptions和集成库中的所有选项。

这个解释有点别扭。简单来说,Glide 4还是给我们提供了一套和Glide 3一模一样的流媒体API接口。毕竟还是有人觉得Glide 3的API比较好用,比如我。

生成的API对于熟悉Glide 3的朋友来说比较简单,基本上和Glide 3的用法一样,只是需要用GlideApp关键字替换Glide关键字,如下图:

GlideApp.with( this)。加载(url)。占位符。错误(可绘制的错误)。skipMemoryCache(真)。磁盘缓存策略(磁盘缓存策略。NONE)。覆盖(目标。大小_原始)。circleCrop()。进入(imageView);

但是,在您的集成开发环境中可能找不到下滑应用程序类。该类由编译时注释自动生成。首先,确保您的代码中有一个自定义模块,并向它添加@ GlideModule注释,这是我们在上一节中讨论的内容。然后点击菜单栏build->在Android Studio中。将自动生成重建项目,GlideApp类。

当然,生成的应用编程接口可以做得更多。它还可以扩展现有的API,定制任何属于你的API。

我举个具体的例子。比如我们要求项目中的所有图片都要缓存原始图片,所以每次使用Glide加载图片时,指定diskcachestrategy(diskcachestrategy . data)这样的长串代码真的很烦人。在这种情况下,我们可以定制一个自己的API。

自定义自己的API需要两个标注:@ GlideExtension和@ GlideOption。使用以下代码创建用户定义的扩展类:

@ GlideExtension

publicClassMyGledExtension { PrivateIgLideExtension(){ } @ GledOptionPublicationStativycachesource(RequestOptions options){ options . Diskcachestrategy(Diskcachestrategy .数据);} }

在这里,我们定义了一个MyGlideExtension类,并在其中添加了@GlideExtension的注释,然后将这个类的构造函数声明为private,所有这些都是必须编写的。

接下来,我们可以开始定制API了。这里我们定义了一个cacheSource()方法,意思是只缓存原始图片,用@ GlideOption标注这个方法。注意定制API的方法必须是静态方法,第一个参数必须是RequestOptions,然后可以添加任意数量的想要定制的参数。

在cacheSource()方法中,我们仍然调用diskcachestrategey(diskcachestrategey . data)方法,所以cacheSource()只是简化API的一层封装。

然后点击菜单栏build->在Android Studio中。重建项目,神奇的事情会发生,你会发现你已经可以用这样的语句加载图片了:

GlideApp.with( this)。加载(url)。cacheSource()。进入(imageView);

有了这个强大的功能,我们可以更灵活地使用Glide。

标签

就这样,我们基本上介绍了Glide 4的所有重要内容。如果你之前对Glide 3非常熟悉,看了这篇文章,相信你能熟练使用Glide 4。如果之前没有接触过Glide,可能深度不够,只能看这篇文章。建议你把前七篇文章读透,这样你就可以成为一个Glide玩家了。

我翻阅了一下历史记录,在今年3月21日发了这个系列的第一篇文章。我花了10个月的时间终于更新了所有的系列。当时答应写八篇,现在兑现了承诺,算是开始,也算是结束。希望以后能继续带给你更好的技术文章,不过这个系列已经结束了。也感谢能看到结局并一直看下去的耐心的朋友们。你和我一样优秀。

最后,我将附上本系列所有其他文章的链接。

1.《glide 带你全面了解Glide 4的用法》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《glide 带你全面了解Glide 4的用法》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/shehui/1202454.html