Fresco实践之基础篇

90630e6f611fcf7cb69b895dc78676d2.png

今天只是入门级别的,先到这里结束,改天打算出一个深度一点的博文介绍用法。

题外话:最近消沉了有快三个月了,这几天都不知道自己在干嘛,这是春节之后的第一篇博文,从今天开始让一切都不一样: 

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

989ae9c75bc38f2575f58787e3c995ad.png

初始化

建议在App启动就初始化,所以建议写在Application#onCreate()中,记得在manifest.xml注册Application。

一般初始化:

755cac996e8bcb16a1724a3222c04754.png

高级初始化

高级初始化-配置缓存文件夹

3536569bf7e793ea3a54847bc2acf784.png

上面的高级初始化当然不止这么一点点,这里举出一个敏感的例子,就是配置缓存SD卡路径,这里涉及到Android6.0运行时权限,我也给一个解决方案,我使用的权限管理库是AndPermission。

首先在Application中判断是否有SD卡权限,如果有则初始化到SD卡,如果没有则采用默认配置:

9cff7fc8c708bbd5432a02e80ef27d9d.png

然后在SplashActivity申请SD卡权限,已被下次进入App时初始化Fresco时拥有SD卡权限:

e6007746de5c7249c765c3feb1b91581.jpeg

高级初始化-配置网络层为OkHttp

Fresco默认使用HttpURLConnection作为网络层,当然也可以配置OkHttp作为它的网络层,配置OkHttp为它的网络层需要依赖下面的库:

6579df4211089b218dba79b90ab10442.png

然后在Application中初始化的时候注意:

fff87ed426061436b80365ecfbe732f5.png

这里只需要注意原来的ImagePipelineConfig换成了OkHttpImagePipelineConfigFactory,并且需要一个OkHttpClient的对象。

加载各种

加载网络图片、url、assets、res、本地File图片。

先给出支持的URI格式列表(列表来自fresco-cn.org):

fe93b70788f2dc186550d85b44536a67.jpeg

SimpleDraweeView

实际开发中,如果没有特殊需求,我们一般使用SimpleDraweeView来占位,传统的图片加载框架一般是使用ImageView,例如:

b8be8cf8cb3c40aa861532bb47353a0b.png

在使用Fresco时我们一般使用SimpleDraweeView,它也是继承ImageView的:

39cbb4f2bb32ea400e91439757e50dc1.png

把它当成我们平常使用的ImageView即可,不过我们要注意Fresco不支持wrap_content,需要使用match_parent或者显示指定view宽高,有些同学看到这个就很头疼了,但是这真的不是什么问题,下面给出解决方案:

一、由服务器返回URL时返回图片的宽高信息 

平常我们服务器这样返回图片url的:

52e2de456c990aab90ce92a344b212c7.png

使用Fresco我们可以把一个图片url当成一个对象包裹起来:

876718041ab3a8f60c93c5dc5e0ffc64.png

或者在URL后面跟一个宽高的参数:

6dbdaf464ed57acab91db656d28c50e5.png

二、根据设计师的给的尺寸,预先设置图片宽高 

设计师设计UI的时候肯定会用一个屏幕作为标准,比如iOS的750*1340,或者Android的720*1280,我们可以根据设计图和手机实际宽高计算出View在手机中应有的宽高,见下面的代码。

最后:我们在解析出来宽高后,我们可以动态的设置SimpleDraweeView的宽高:

99c23e8bc9cc974d27acce54f509364b.png

基础配置和注意的地方讲完了,那么下面就是重头戏了,如何加载图片。

一、加载http/https远程图片

3d8a841ef39e96e81b7019462ffa47cb.png

二、显示本地图片

这里就有个坑了,先看一下下面我写了两个方法,一个需要传入View的实际宽高,一个不需要。上面已经说了,SimpleDraweeView需要在xml中、Java中指定它的宽高,或者是使用match_parent。

这里需要注意,1. 如果view指定的宽高不是match_parent则直接调用第二个不需要传入宽高的发那个发,如果为SimpleDraweeView写的宽高是match_parent时,加载图片需要告诉Fresco你的View在屏幕上的实际宽高是多少,否则是不能加载出来的。

比如,你的SimpleDraweeView是全屏的,那么你就填入屏幕的宽高,如果不是全屏,就利用上面讲的方法测量出View的实际宽高后传入。

412c2c6ed5e36eea7e4d5d260cb37624.jpeg

三、显示res中图片

这里要注意,我们在为res中的图片生成Uri的时候:

812fb8c107ca75a79bb147299be1570f.png

所以我们一般留空,因此我们的代码看起来是下面的样子:

bf5d3afe7ce8e36bf4e17936dfb32366.png

四、显示ContentProvider图片

696c5d215b25f149f4133118f3a0a428.png

五、显示assets中的图片

edb13095515ff596ac6ad54b7f209b7f.png

你以为到这里就完了吗?太天真了,请继续看。

一些默认属性的设置

d3abdd41dd8ff401b47c634d0e4be834.jpeg

xml中可以配置,在Java代码中也是可以配置的,我这里列出一部分API:

f3fff4207d0ac0515bf6dc12ba945662.png

一些特殊效果

第一个,先来一个圆形图片带白色的边:

2fee1464ec4f42eaaa4279c1e52d72c2.jpeg

综合上面的属性这里就不多解释了:

6bb3ebaea40edc01679e595dcbd5ed10.png

第二个,Fresco高斯模糊:

fd8f0604c2fec98a676deed8c2dbb795.jpeg

2373ddf9bce230e5701d51a3628ae51b.png

效果就这样子,其它的关于进度条子类的自己去试试吧,我就不演示占篇幅了。

拿到缓存的Bitmap

有几次在群里讨论关于Fresco的问题,很多同学吐槽Fresco没有直接拿到Bitmap的方法,其实直接拿到Bitmap相当于从SD卡读取一个文件,如果图片过大,就会耗时,造成App卡(假)死,所以我们要采用异步的方式:

99d190343f60ecf53dadd989ba11099c.png

用起来也很简单:

1f4da63e9b77b5f87af0383d6778491d.png

今天的技术篇就到这里吧,下次再见啦。

长按二维码即可关注本号

432867d4f87ad86b79067bf178fa7b5a.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值