今天只是入门级别的,先到这里结束,改天打算出一个深度一点的博文介绍用法。
题外话:最近消沉了有快三个月了,这几天都不知道自己在干嘛,这是春节之后的第一篇博文,从今天开始让一切都不一样:
Code Behavior, one can.t be less.
Fresco是一个Facebook开源的Android图片加载库,性能真的让我无话可说,而且满足了我对图片加载的一切幻想,所以我必须为它写一篇文章,当然更多的是自己的总结与记录。
Fresco开源地址:https://github.com/facebook/fresco
Fresco文档地址:https://www.fresco-cn.org
前端时间我写了一个Android相册库Album,当时我在做测试的时候发现,用Picasso或者Glide时,当列表达到上千条时,滑动起来就会卡,但是换成Fresco后一点都不卡了,而且Fresco做到的几个内置效果让我欣喜若狂,所以我把我的使用总结记录下来:
依赖Fresco
初始化
建议在App启动就初始化,所以建议写在Application#onCreate()中,记得在manifest.xml注册Application。
一般初始化:
高级初始化
高级初始化-配置缓存文件夹
上面的高级初始化当然不止这么一点点,这里举出一个敏感的例子,就是配置缓存SD卡路径,这里涉及到Android6.0运行时权限,我也给一个解决方案,我使用的权限管理库是AndPermission。
首先在Application中判断是否有SD卡权限,如果有则初始化到SD卡,如果没有则采用默认配置:
然后在SplashActivity申请SD卡权限,已被下次进入App时初始化Fresco时拥有SD卡权限:
高级初始化-配置网络层为OkHttp
Fresco默认使用HttpURLConnection作为网络层,当然也可以配置OkHttp作为它的网络层,配置OkHttp为它的网络层需要依赖下面的库:
然后在Application中初始化的时候注意:
这里只需要注意原来的ImagePipelineConfig换成了OkHttpImagePipelineConfigFactory,并且需要一个OkHttpClient的对象。
加载各种
加载网络图片、url、assets、res、本地File图片。
先给出支持的URI格式列表(列表来自fresco-cn.org):
SimpleDraweeView
实际开发中,如果没有特殊需求,我们一般使用SimpleDraweeView来占位,传统的图片加载框架一般是使用ImageView,例如:
在使用Fresco时我们一般使用SimpleDraweeView,它也是继承ImageView的:
把它当成我们平常使用的ImageView即可,不过我们要注意Fresco不支持wrap_content,需要使用match_parent或者显示指定view宽高,有些同学看到这个就很头疼了,但是这真的不是什么问题,下面给出解决方案:
一、由服务器返回URL时返回图片的宽高信息
平常我们服务器这样返回图片url的:
使用Fresco我们可以把一个图片url当成一个对象包裹起来:
或者在URL后面跟一个宽高的参数:
二、根据设计师的给的尺寸,预先设置图片宽高
设计师设计UI的时候肯定会用一个屏幕作为标准,比如iOS的750*1340,或者Android的720*1280,我们可以根据设计图和手机实际宽高计算出View在手机中应有的宽高,见下面的代码。
最后:我们在解析出来宽高后,我们可以动态的设置SimpleDraweeView的宽高:
基础配置和注意的地方讲完了,那么下面就是重头戏了,如何加载图片。
一、加载http/https远程图片
二、显示本地图片
这里就有个坑了,先看一下下面我写了两个方法,一个需要传入View的实际宽高,一个不需要。上面已经说了,SimpleDraweeView需要在xml中、Java中指定它的宽高,或者是使用match_parent。
这里需要注意,1. 如果view指定的宽高不是match_parent则直接调用第二个不需要传入宽高的发那个发,如果为SimpleDraweeView写的宽高是match_parent时,加载图片需要告诉Fresco你的View在屏幕上的实际宽高是多少,否则是不能加载出来的。
比如,你的SimpleDraweeView是全屏的,那么你就填入屏幕的宽高,如果不是全屏,就利用上面讲的方法测量出View的实际宽高后传入。
三、显示res中图片
这里要注意,我们在为res中的图片生成Uri的时候:
所以我们一般留空,因此我们的代码看起来是下面的样子:
四、显示ContentProvider图片
五、显示assets中的图片
你以为到这里就完了吗?太天真了,请继续看。
一些默认属性的设置
xml中可以配置,在Java代码中也是可以配置的,我这里列出一部分API:
一些特殊效果
第一个,先来一个圆形图片带白色的边:
综合上面的属性这里就不多解释了:
第二个,Fresco高斯模糊:
效果就这样子,其它的关于进度条子类的自己去试试吧,我就不演示占篇幅了。
拿到缓存的Bitmap
有几次在群里讨论关于Fresco的问题,很多同学吐槽Fresco没有直接拿到Bitmap的方法,其实直接拿到Bitmap相当于从SD卡读取一个文件,如果图片过大,就会耗时,造成App卡(假)死,所以我们要采用异步的方式:
用起来也很简单:
今天的技术篇就到这里吧,下次再见啦。
长按二维码即可关注本号