Glide进阶详解(十一)
来源:互联网 发布:英国的青年知乎 编辑:程序博客网 时间:2024/05/29 06:39
为何要在指定的尺寸下请求图片
在一个最近的项目中我们与一个多媒体服务端工作,它也是图片服务端,提供了非常高的图像质量(图像可能有 6000x4500 像素)。虽然我们可以直接用链接去拿源文件,但这对于设备的带宽,内存和电池来说,这么做是非常低效的。即使今天的设备有着非常高的分辨率显示屏,有这么高的一个分辨率没有任何好处。这就是为什么 Glide 总是测量 ImageView
的尺寸,并减少图像的内存分配大小。所以,这里仍然需要减少下载和计算处理的开销。因此,这个多媒体服务端给了一个新功能:它可以提供自定义图像的分辨率。这么想象一下吧:
// previous way: we directly accessed the imageshttps://futurestud.io/images/logo.png// new way, server could handle additional parameter and provide the image in a specific size// in this case, the server would serve the image in 400x300 pixel sizehttps://futurestud.io/images/logo.png?w=400&h=300
媒体服务端维护了之前的计算大小在磁盘上,如果没有请求传过去,缩放图像仍然在天上飞呢。现在初步实现了 Android 这边计算好了 ImageView
的大小,然后用 链接 URL(就像 ../logo.png?w=400&h=300
)做 Glide 请求。向我们之前给你展现的那样。这种方式奏效了,但是有点复杂,特别是如果你认为 Glide 在这里提供了帮助。
另一种自定义 GlideModule
当然,我们必须声明一个新的 Glide module。在这种情况下,我们必须用 glide.register()
方法注册新的 model 到 Glide。
public class CustomImageSizeGlideModule implements GlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { // nothing to do here } @Override public void registerComponents(Context context, Glide glide) { glide.register(CustomImageSizeModel.class, InputStream.class, new CustomImageSizeModelFactory()); }}
该 .register()
调用了 Glide 的配置去给所有的请求,实现 CustomImageSizeModel
接口(替换常规的 GlideUrl
接口)。所以在这里你可以创建并传递一个 CustomImageSizeModel
的实例去实现给 Glide。 为了处理这个新的自定义 model。我们要去写一个 CustomImageSizeModelFactory
类,创建了我们的 model 处理的实例。
综上所述,在你添加了上述的 Glide module 后,你应该有两个未知的类。首先是 CustomImageSizeModel
。
public interface CustomImageSizeModel { String requestCustomSizeUrl(int width, int height);}
CustomImageSizeModel
只是一个接口,它将宽度和高度作为其参数,这是必须的,这样我们才能从媒体服务端请求精确的像素图像。第二个未知的类是 CustomImageSizeModelFactory
:
private class CustomImageSizeModelFactory implements ModelLoaderFactory<CustomImageSizeModel, InputStream> { @Override public ModelLoader<CustomImageSizeModel, InputStream> build(Context context, GenericLoaderFactory factories) { return new CustomImageSizeUrlLoader( context ); } @Override public void teardown() { }}
这个类仅仅实现了 Glide 的 ModelLoaderFactory
接口。它为我们的 CustomImageSizeUrlLoader
类创建了一个新的实例,一旦 Glide 请求被创建,它将负责加载图像。
public class CustomImageSizeUrlLoader extends BaseGlideUrlLoader<CustomImageSizeModel> { public CustomImageSizeUrlLoader(Context context) { super( context ); } @Override protected String getUrl(CustomImageSizeModel model, int width, int height) { return model.requestCustomSizeUrl( width, height ); }}
这样,我们为自定义大小的请求的新的 Glide module 已经做完了。我们已经在 Glide module 这边实现了所有的东西的,但是我们还没有实际创建 CustomImageSizeModel
接口的实现。为了用 CustomImageSizeModel
传递请求给 Glide。我们需要一个雷,它建立了自定义图片大小的 URL:
public class CustomImageSizeModelFutureStudio implements CustomImageSizeModel { String baseImageUrl; public CustomImageSizeModelFutureStudio(String baseImageUrl) { this.baseImageUrl = baseImageUrl; } @Override public String requestCustomSizeUrl(int width, int height) { // previous way: we directly accessed the images // https://futurestud.io/images/logo.png // new way, server could handle additional parameter and provide the image in a specific size // in this case, the server would serve the image in 400x300 pixel size // https://futurestud.io/images/logo.png?w=400&h=300 return baseImageUrl + "?w=" + width + "&h=" + height; }}
在上面的 CustomImageSizeModelFutureStudio
类中,我们已经实现了建立图片 URL 的逻辑:附加了高度和宽度的参数。最后,我们可以创建这个类的实例并做一个 Glide 请求:
String baseImageUrl = "https://futurestud.io/images/example.png"; CustomImageSizeModel customImageRequest = new CustomImageSizeModelFutureStudio( baseImageUrl );Glide .with( context ) .load( customImageRequest ) .into( imageView2 );
正如你看到的,我们不需要传一个精确的尺寸。Glide 会测量 ImageView
然后传给我们的请求。现在服务端会返回这个图片的完美的优化后的尺寸了!
当然你可以添加其他的 CustomImageSizeModel
model 实现。如果你有多个服务端,它们使用了不同的逻辑去简历 URL。只需要创建一个新的 CustomImageSizeModel
实现然后传递它到你的 Glide 请求中。你可以使用很多的 model 去按照你需要的来实现!
自定义图像大小
提示:如果你还没读过我们之前的博客,现在去读一下。否则,下面这部分看起来很困难。
作为一个简短的回顾:通常 Glide 的请求是和 GlideUrl
类来使用的。上周我们已经向你展示了如何创建一个新的接口,来考虑增加宽度和高度。
public interface CustomImageSizeModel { String requestCustomSizeUrl(int width, int height);}
我们创建了一个实现,它及案例额传递了图像的 URL 加上尺寸提交给了工作服务器。
public static class CustomImageSizeModelFutureStudio implements CustomImageSizeModel { String baseImageUrl; public CustomImageSizeModelFutureStudio(String baseImageUrl) { this.baseImageUrl = baseImageUrl; } @Override public String requestCustomSizeUrl(int width, int height) { return baseImageUrl + "?w=" + width + "&h=" + height; }}
最后,这并不是最重要的,我们必须创建一个 CustomImageSizeUrlLoader
,它传了宽度和高度给了我们的 model 实现:
public static class CustomImageSizeUrlLoader extends BaseGlideUrlLoader<CustomImageSizeModel> { public CustomImageSizeUrlLoader(Context context) { super( context ); } @Override protected String getUrl(CustomImageSizeModel model, int width, int height) { return model.requestCustomSizeUrl( width, height ); }}
Model Loader 和 .using() 的动态使用
目前我们已经声明了 Glide module。Glide 会把它用在每一个请求。如果你不想这样,从 AndroidManifest.xml
中删除你的 Glide module。我们可以这么做是因为 Glide 提供了 .using()
方法去为单个的请求指定一个 model。
String baseImageUrl = "https://futurestud.io/images/example.png"; CustomImageSizeModel customImageRequest = new CustomImageSizeModelFutureStudio( baseImageUrl );Glide .with( context ) .using( new CustomImageSizeUrlLoader( context ) ) .load( customImageRequest ) .into( imageView1 );
正如你看到的,我们正在创建一个 CustomImageSizeModelFutureStudio
对象来为我们的图像按照指定的大小加载。因为没有在 Glide module 中声明 CustomImageSizeModel
接口,我们必须指明这行代码 .using(new CustomImageSizeUrlLoader(context))
。Glide 现在会只为这个请求用这个 model。对于其他的请求,即使它们有 CustomImageSizeModel
接口,也不会受影响。
- Glide进阶详解(十一)
- Glide进阶详解(一)
- Glide进阶详解(二)
- Glide进阶详解(三)
- Glide进阶详解(四)
- Glide进阶详解(五)
- Glide进阶详解(六)
- Glide进阶详解(七)
- Glide进阶详解(八)
- Glide进阶详解(九)
- Glide进阶详解(十)
- Glide进阶详解(十二)
- C#进阶教程(十一)
- Glide使用详解(一)
- Glide使用详解(二)
- Glide使用详解(一)
- Glide使用详解(一)
- Glide使用详解(二)
- 【IMX6UL开发板试用体验】上手试用与资源使用
- Two pointers (5) -- Remove Duplicates from Sorted Array I, II, Move Zeroes, Remove Element
- C++学习第四课
- Redis-内存
- 简单编程题目连载(十)——公共最长子序列
- Glide进阶详解(十一)
- 手动实现Spring Aop
- Xcode模拟器很慢
- linux下安装subversion1.9.5
- PHP MVC 小实例
- 好用的运维工具Open-Falcon
- XML解析方式及GData框架使用
- wikioi 数的划分
- Glide进阶详解(十二)