Glide 魔法般的自定义扩展
使用过Glide的朋友都明白,简单的用法就是:
Glide.with(context)
.load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
.into(ivImg);
而Picasso看起来像是Glide的“兄弟”一样,但Glide的with中提供了多种传递形式,如activity和Fragment,这样设计的目无非是想跟随宿主的生命周期来做事儿。
而且从夹在图片的参数上看默认加载为RGB_565图片,从查找的资料显示RGB_565与ARGB_8888图片相比,在比较普通的手机上肉眼似乎不能区分。
自然RGB_565质量相比较差,运行时占据的内存也是差了不少,这可就是我们的重点啦,有效的减缓了oom机会!如果你仍要使用高质量的图片,那么Glide确实提供了GlideModule方式自定义设置,
在清单文件application中插入meat-data即可:
<meta-data android:name="com.inthecheesefactory.lab.glidepicasso.GlideConfiguration" android:value="GlideModule"/>
重写GlideModule:
@Override
public void applyOptions(Context context, GlideBuilder builder) {//既然拿到了GlideBuilder我们就应该可以做很多事儿啦!
//DecodeFormat.PREFER_ARGB_8888 //DecodeFormat.PREFER_RGB_565 builder.setDecodeFormat(。。。); } @Override public void registerComponents(Context context, Glide glide) { }
没错既然重写了GlideModule,并且拿到了GlideBuilder,如果到此为止的话那自定义的Glide就显得太过于Low啦!
除了上面代码中设置了图片的质量参数外,重头戏就在于这两个方法:
builder.setMemoryCache( new LruResourceCache( customMemoryCacheSize );
builder.setBitmapPool( new LruBitmapPool( customBitmapPoolSize );//关于Lru可以自己了解
现在可以望文生义,就是用来设置Glide要占用RAM的一个缓存阀值额度。
方式可选如下:
1)完全自定义标准
int maxMemory = (int) Runtime.getRuntime().maxMemory();//获取系统分配给应用的总内存大小
int memoryCacheSize = maxMemory / 6;//设置图片内存缓存占用整个app的比例
2)按照Glide默认标准,可以自己在做调整,当然如果你有理由去厌恶内存缓存也可以直接.skipMemoryCache( true )
MemorySizeCalculator calculator = new MemorySizeCalculator(context);
int defaultMSize = calculator.getMemoryCacheSize();
int defaultBPoolSize = calculator.getBitmapPoolSize();
在持久化缓存方面Glide也提供的相当ok
builder.setDiskCache(new InternalCacheDiskCacheFactory(context,xxxxxx));
//使用内部存储和外部存储做缓存时只能二选一
builder.setDiskCache(new ExternalCacheDiskCacheFactory(context,xxxxxx));
而且也可以使用DiskLruCacheFactory制定外部路径:
builder.setDiskCache(new DiskLruCacheFactory( Environment.getDownloadCacheDirectory().getPath(), xxxxx));
如果确定这么做对你有用,那就试试吧!
在图片加载的优先级需求上,Glide工程师也为我们做好了链式的调用方法,可以说实在是太贴心!
方法很简单, load(...).priority( Priority.LOW )和.priority( Priority.HIGH )分别是低权重加载和高权重加载。在同时请求的情况下,设置了高权重加载
绝大多数情况下会优先加载出来;虽然并不是非常严格的遵守就像onRestoreInstanceState一样谷歌不能保证100%的调用。
哈哈,说到这里有些兴奋的肚子饿了,Glide提供了.into方法设置宿主ImageView,但实际有很多的应用场景,我们不能够直接去使用ImageView,
如包装起来的自定义控件;就在这时Glide工程师又将汤勺放到了你的嘴边。
最后介绍下Glide中提供了ViewTarget和SimpleTarget两种包装的形式,分别开放出Drawable和Bitmap,这使我们直接可以获取到它
转换处理过程的中间产物,示例如下:
//ViewTarget能够支持转换成Drawable
自定义View custView=new 自定义View(context)
public ViewTarget<自定义View, GlideDrawable> vt = new ViewTarget<自定义View, GlideDrawable>(custView) {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
this.view.自定义View中设置图片的方法(resource.getCurrent());
} };
Glide .with( context ).load( xxx).into( vt );
private SimpleTarget starget = new SimpleTarget<Bitmap>( 300, 300 ) { //如果能够预知图片的大小,可以在这里做限制,这会使加载变得又完美了一步!
@Override
public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {
imageView2.setImageBitmap( bitmap );
}
};
private void loadImageSimpleTargetApplicationContext() {
Glide
.with( context ).load( xxxx ).asBitmap()
.into( starget );
}
以上的两种方式并没有写成into接收new匿名对象的方式,这样into持有全局对象的意义是可以有力的防止匿名对象被GC抹掉!!!
Glide 魔法般的自定义扩展的更多相关文章
- SharePoint 2013 自定义扩展菜单
在对SharePoint进行开发或者功能扩展的时候,经常需要对一些默认的菜单进行扩展,以使我们开发的东西更适合SharePoint本身的样式.SharePoint的各种功能菜单,像网站设置.Ribbo ...
- SharePoint 2013 自定义扩展菜单(二)
接博文<SharePoint 2013 自定义扩展菜单>,多加了几个例子,方便大家理解. 例七 列表设置菜单扩展(listedit.aspx) 扩展效果 XML描述 <CustomA ...
- WCF自定义扩展,以实现aop!
引用地址:https://msdn.microsoft.com/zh-cn/magazine/cc163302.aspx 使用自定义行为扩展 WCF Aaron Skonnard 代码下载位置: S ...
- Jquery自定义扩展方法(二)--HTML日历控件
一.概述 研究了上节的Jquery自定义扩展方法,自己一直想做用jquery写一个小的插件,工作中也用到了用JQuery的日历插件,自己琢磨着去造个轮子--HTML5手机网页日历控件,废话不多说,先看 ...
- Silverlight实例教程 - 自定义扩展Validation类,验证框架的总结和建议(转载)
Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...
- jQuery 自定义扩展,与$冲突处理
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- SparkContext自定义扩展textFiles,支持从多个目录中输入文本文件
需求 SparkContext自定义扩展textFiles,支持从多个目录中输入文本文件 扩展 class SparkContext(pyspark.SparkContext): def ...
- 基于 HtmlHelper 的自定义扩展Container
基于 HtmlHelper 的自定义扩展Container Intro 基于 asp.net mvc 的权限控制系统的一部分,适用于对UI层数据呈现的控制,基于 HtmlHelper 的扩展组件 Co ...
- 第十三节:HttpHander扩展及应用(自定义扩展名、图片防盗链)
一. 自定义扩展名 1. 前言 凡是实现了IHttpHandler接口的类均为Handler类,HttpHandler是一个HTTP请求的真正处理中心,在HttpHandler容器中,ASP.NET ...
随机推荐
- VR的国内研究现状及发展趋势
转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 一.国内研究现状 我国虚拟现实技术研究起步较晚,与发达国家还有一定的差距. 随着计算机图形学.计算机系统 ...
- 【MongoDB】 Windows 安装
Windows下安装MongoDB,虽然网上有很多攻略,但是还是有很多坑,为了以后少犯错误,特此记录. 1.下载安装包 https://fastdl.mongodb.org/win32/mongodb ...
- Fiddler响应post的请求 request body里面填写什么?
若是想传json格式的数据,请求头可以这样写:(应该先勾选 post,然后写上正确滴请求地址)User-Agent: Fiddler Host: localhost:1455 <span sty ...
- Git TortoiseGit SSH设置
Git TortoiseGit SSH设置 http://www.cnblogs.com/ChenRihe/p/Git_TortoiseGit_SSH.html TortoiseGit默认的SSH客户 ...
- RHCS 6.5 由于resource-agents-3.9.2-40.el6版本过低导致rgmanager[61164]: [fs] umount failed - REBOOTING问题的解决
問題描述: RHEL 6.5版本RHCS在disable或者relocate service的時候,會導致節點重啟,查看日誌顯示umount掛载點失敗,日誌如下: Nov 29 16:03:50 ph ...
- Vue#表单控件绑定
使用v-model 在表单控件上实现数据双向绑定. 单选:https://jsfiddle.net/miloer/bs49p0fx/ <input type="checkbox&quo ...
- 关于HTML的FORM上传文件问题
首先,大家可以测试后一段代码 <form id="form1" runat="server"> <input type="file& ...
- C# 的EF框架怎么连接Oracle数据库
安装odp.net ODP.NET你不需要安装Oracle,不需要配置oracle.key文件,不需要配置TnsNames.Ora文件 不需要配置环境变量:完全的傻瓜式的在没有安装oracle数据库或 ...
- CodeForces 515B. Drazil and His Happy Friends
B. Drazil and His Happy Friends time limit per test 2 seconds memory limit per test 256 megabytes in ...
- 【原】PHP初体验
1. 相关内容介绍 1>互联网开发 互联网:传统互联网.移动互联网 互联网开发:前端开发(前台).后台开发(后端.服务端) 前端开发:视觉展示(用户界面).用户交互.采集输入信息 后台开发:管理 ...