前言
这篇文章主要讲述Fresco在AS中的详细使用流程。
引入Fresco
类库发布到了Maven中央库,Android Studio 或者 Gradle:
关于在Android Studio中编译
Fresco 是一个典型的Android Studio 项目。如果想编译源码, 看demo项目,可以通过gradle或者Android Studio。一直以来,在国内更新Android SDK以及使用Android Studio导入项目时,都是一件麻烦的事情。使用gradle 或者 Android Studio会遇到一些网络障碍。这些障碍,需要FQ才能顺利完成编译。
另外对于NDK,因为Android Studio还支持不够。所以需要在命令行下预编译。
具体可以参考:
编译Fresco
- 设置好代理,从github顺利clone项目
- 给SDK Manager 设置好代理,顺利更新sdk到最新
- 给Android Studio设置好代理,顺利打开freso项目
Open an exsiting Android Studio Project,选择build.gradle - 但是,Android Studio目前还不支持NDK,所以需要在命令行下预编译。//最新版本支持NDK(1.4)
./gradlew :sample:assembleDebug
好了,编译完成之后,Android Studio就可以正常运行了。
开始使用 Fresco
如果你仅仅是想简单下载一张网络图片,在下载完成之前,显示一张占位图,那么简单使用 SimpleDraweeView 即可。
为了下载网络图片,请确保在 AndroidManifest.xml 中有以下权限:
在 Application 初始化时,在应用调用 setContentView() 之前,进行初始化:
在xml布局文件中, 加入命名空间:
加入SimpleDraweeView:
开始加载图片
剩下的,Fresco会替你完成:
- 显示占位图直到加载完成;
- 下载图片;
- 缓存图片;
- 图片不再显示时,从内存中移除;
等等等等。
关键概念
Drawees
Drawees 负责图片的呈现,包含几个组件,有点像MVC模式。
DraweeView
继承于 View, 负责图片的显示。
一般情况下,使用SimpleDraweeView 即可. 简单的用法,在这个页面:开始使用 。
它支持很多自定义效果,参见这里: 自定义显示效果.
DraweeHierarchy
DraweeHierarchy 用于组织和维护最终绘制和呈现的Drawable对象,相当于MVC中的M(Model)。
如果你想在Java代码中自定义图片的展示,可以通过这类实现,具体的请参考这里: 在Java代码中自定义显示效果
DraweeController
DraweeController 负责和 image loader 交互(默认是Fresco中 image pipeline),可以创建一个这个类的实例,来实现对所要显示的图片做更多的控制。
DraweeControllerBuilder
DraweeControllers 由 DraweeControllerBuilder 采用 Builder 模式创建,创建之后,不可修改。具体参见: 使用ControllerBuilder。
Listeners
使用 ControllerListener 的一个场景就是设置一个 Listener监听图片的下载。
Image Pipeline
Fresco 的 Image Pipeline 负责图片的获取和管理。图片可以来自远程服务器,本地文件,或者Content Provider,本地资源。压缩后的文件缓存在本地存储中,Bitmap数据缓存在内存中。
在5.0系统以下,Image Pipeline 使用`pinned purgeables*将Bitmap数据避开Java堆内存,存在ashmem中。这要求图片不使用时,要显式地释放内存。
SimpleDraweeView 自动处理了这个释放过程,所以没有特殊情况,尽量使用SimpleDraweeView,在特殊的场合,如果有需要,也可以直接控制Image Pipeline。
ImageRequest
ImageRequest存储着Image Pipeline处理被请求图片所需要的有用信息(Uri、是否渐进式图片、是否返回缩略图、缩放、是否自动旋转等。)。
它仅仅用来装信息,而且一经初始化后就无法改变内容(即Immutable,不过可以获取内容)。 并且它的初始化只能通过ImageRequest.fromUri(Uri uri)或ImageRequestBuilder.build()来实现。
SimpleDraweeView调用setUri(Uri)会产生一个默认的ImageRequest含有指定Uri信息,如果需要修改ImageRequest其他信息,必须手动创建ImageRequest,并在PipelineDraweeControllerBuilder调用.build()之前使用.setImageRequest设置它。
支持的URIs
Fresco 支持许多URI格式。
特别注意:Fresco 不支持 相对路径的URI. 所有的URI都必须是绝对路径,并且带上该URI的scheme。
如下:
类型 | Scheme | 示例 |
---|---|---|
远程图片 | http://, https:// | HttpURLConnection 或者参考使用其他网络加载方案 |
本地文件 | file:// | FileInputStream |
Content provider | content:// | ContentResolver |
asset目录下的资源 | asset:// | AssetManager |
res目录下的资源 | res:// | Resources.openRawResource |
res 示例:
注意:
只有图片资源才能使用在Image pipeline中,比如(PNG)。其他资源类型,比如字符串,或者XML Drawable在Image pipeline中没有意义。所以加载的资源不支持这些类型。
像ShapeDrawable这样声明在XML中的drawable可能引起困惑。注意到这毕竟不是图片,如果想把这样的drawable作为图像显示。
那么把这个drawable设置为占位图,然后把URI设置为null。