Fresco实践之基础篇

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


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

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



Fresco实践之基础篇


初始化


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


一般初始化:

Fresco实践之基础篇


高级初始化


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

Fresco实践之基础篇

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


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

Fresco实践之基础篇

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

Fresco实践之基础篇

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

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

Fresco实践之基础篇

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

Fresco实践之基础篇

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


加载各种


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

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

Fresco实践之基础篇

SimpleDraweeView

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

Fresco实践之基础篇

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

Fresco实践之基础篇

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

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

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

Fresco实践之基础篇

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

Fresco实践之基础篇

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

Fresco实践之基础篇

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

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


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

Fresco实践之基础篇

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

一、加载http/https远程图片

Fresco实践之基础篇

二、显示本地图片

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


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


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

Fresco实践之基础篇

三、显示res中图片

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

Fresco实践之基础篇

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

Fresco实践之基础篇

四、显示ContentProvider图片

Fresco实践之基础篇

五、显示assets中的图片

Fresco实践之基础篇

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


一些默认属性的设置


Fresco实践之基础篇

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

Fresco实践之基础篇


一些特殊效果


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

Fresco实践之基础篇

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

Fresco实践之基础篇

第二个,Fresco高斯模糊:

Fresco实践之基础篇

Fresco实践之基础篇

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


拿到缓存的Bitmap


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

Fresco实践之基础篇

用起来也很简单:

Fresco实践之基础篇

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


长按二维码即可关注本号

Fresco实践之基础篇



相关文章:

  • 2021-06-14
  • 2021-04-15
  • 2021-09-16
  • 2022-01-09
  • 2021-09-24
  • 2021-07-25
  • 2021-11-01
  • 2021-08-01
猜你喜欢
  • 2021-11-22
  • 2021-12-23
  • 2021-08-24
  • 2022-12-23
  • 2021-04-28
  • 2021-10-17
相关资源
相似解决方案