这里告诉你如何在项目中引入 Fresco.
编辑 build.gradle
文件:
1 2 3 4 |
dependencies { // 其他依赖 compile 'com.facebook.fresco:fresco:0.12.0' } |
下面的依赖需要根据需求添加:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
dependencies { // 在 API < 14 上的机器支持 WebP 时,需要添加 compile 'com.facebook.fresco:animated-base-support:0.12.0' // 支持 GIF 动图,需要添加 compile 'com.facebook.fresco:animated-gif:0.12.0' // 支持 WebP (静态图+动图),需要添加 compile 'com.facebook.fresco:animated-webp:0.12.0' compile 'com.facebook.fresco:webpsupport:0.12.0' // 仅支持 WebP 静态图,需要添加 compile 'com.facebook.fresco:webpsupport:0.12.0' } |
下载 zip 文件.
解压后,你会看到一个目录:frescolib,注意这个目录。
drawee
, fbcore
, fresco
, imagepipeline
, imagepipeline-base
。请确认这5个项目一定是被选中的。点击完成。其他的项目参考之前 Gradle的额外依赖介绍。现在,fresco 就导入到项目中了,你可以开始编译了。如果编译不通过,可以尝试清理资源,或者重启 Eclipse。
如果你想在网络层使用 OkHttp,请看这里.
如果 support-v4 包重复了,删掉 frescolib/imagepipeline/libs 下的即可。
如果你仅仅是想简单下载一张网络图片,在下载完成之前,显示一张占位图,那么简单使用 SimpleDraweeView 即可。
在加载图片之前,你必须初始化Fresco
类。你只需要调用Fresco.initialize
一次即可完成初始化,在 Application
里面做这件事再适合不过了(如下面的代码),注意多次的调用初始化是无意义的。
1 2 3 4 5 6 7 8 |
[MyApplication.java] public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); } } |
做完上面的工作后,你需要在 AndroidManifest.xml
中指定你的 Application 类。为了下载网络图片,请确认你声明了网络请求的权限。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
在xml布局文件中, 加入命名空间:
1 2 3 4 5 6 |
|
加入SimpleDraweeView
:
1 2 3 4 5 6 |
|
开始加载图片:
1 2 3 |
Uri uri = Uri.parse("https://raw.githubusercontent.com/facebook/fresco/gh-pages/static/logo.png"); SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view); draweeView.setImageURI(uri); |
剩下的,Fresco会替你完成:
等等等等。
Drawees 负责图片的呈现。它由三个元素组成,有点像MVC模式。
继承于 View, 负责图片的显示。
一般情况下,使用 SimpleDraweeView
即可。 你可以在 XML 或者在 Java 代码中使用它,通过 setImageUri
给它设置一个 URI 来使用,这里有简单的入门教学:开始使用
你可以使用 XML属性来达到各式各样的效果。
DraweeHierarchy 用于组织和维护最终绘制和呈现的 Drawable 对象,相当于MVC中的M。
你可以通过它来在Java代码中自定义图片的展示,具体的请参考这里: 在Java代码中自定义显示效果
DraweeController
负责和 image loader 交互( Fresco 中默认为 image pipeline, 当然你也可以指定别的),可以创建一个这个类的实例,来实现对所要显示的图片做更多的控制。
如果你还需要对Uri加载到的图片做一些额外的处理,那么你会需要这个类的。
DraweeControllers
由 DraweeControllerBuilder 采用 Builder 模式创建,创建之后,不可修改。具体参见: 使用ControllerBuilder。
使用 ControllerListener
的一个场景就是设置一个 Listener监听图片的下载。
Fresco 的 Image Pipeline 负责图片的获取和管理。图片可以来自远程服务器,本地文件,或者Content Provider,本地资源。压缩后的文件缓存在本地存储中,Bitmap数据缓存在内存中。
在5.0系统以下,Image Pipeline 使用 pinned purgeables 将Bitmap数据避开Java堆内存,存在ashmem中。这要求图片不使用时,要显式地释放内存。
SimpleDraweeView
自动处理了这个释放过程,所以没有特殊情况,尽量使用SimpleDraweeView,在特殊的场合,如果有需要,也可以直接控制Image Pipeline。
Fresco 支持许多URI格式。
特别注意:Fresco 不支持 相对路径的URI. 所有的 URI 都必须是绝对路径,并且带上该 URI 的 scheme。
如下:
类型 | Scheme | 示例 |
---|---|---|
远程图片 | http://, https:// |
HttpURLConnection 或者参考 使用其他网络加载方案 |
本地文件 | file:// |
FileInputStream |
Content provider | content:// |
ContentResolver |
asset目录下的资源 | asset:// |
AssetManager |
res目录下的资源 | res:// |
Resources.openRawResource |
Uri中指定图片数据 | data:mime/type;base64, |
数据类型必须符合 rfc2397规定 (仅支持 UTF-8) |
res 示例:
1 |
Uri uri = Uri.parse("res://包名(实际可以是任何字符串甚至留空)/" + R.drawable.ic_launcher); |
注意,只有图片资源才能使用在Imagepipeline中,比如(PNG)。其他资源类型,比如字符串,或者XML Drawable在Imagepipeline中没有意义。所以加载的资源不支持这些类型。
像ShapeDrawable
这样声明在XML中的drawable可能引起困惑。注意到这毕竟不是图片。如果想把这样的drawable作为图像显示,那么把这个drawable设置为占位图,然后把URI设置为null
。