android Fresco

 
  
Fresco 优点: 1,使用简便,学习成本低 2,十分强大,使用起来非常流畅,内存管理不用愁,不用担心OOM。 3,自带加载时淡入效果,开发起来不费劲. 4,图片加载时可在布局中直接设置加载动画等等,代码量大大减少 缺点: 1,必须使用fresco自定义的控件,如果需求更换,想要更换其他图片加载框架会有一定的麻烦,比如必须要改布局 2,方法数太多,多达近4k方法,对于比较大的项目来说简直是压死骆驼的最后一个稻草,整项目方法数超过65k,不 得不分包.而且打包之后整个项目整整多了3M.确实大得很. 3,必须全套使用fresco的图片加载,否则连获取简简单单的一个缓存中的bitmap都异常费劲 总结: 如果自己的项目不是社交软件,涉及到特别多图片加载的话,还是慎用吧. 当然,在我的印象中,fresco就是你项目中图片加载处理的专业管家,几乎一切繁杂的事情它都帮你处理妥当,用起来简直贴心.
作者:刁新强 链接:https://www.jianshu.com/p/ec4961133192 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

引入Fresco

这里告诉你如何在项目中引入 Fresco.

使用 Android Studio 或者其他 Gradle 构建的项目

编辑 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'
}

Eclipse ADT

下载 zip 文件.

解压后,你会看到一个目录:frescolib,注意这个目录。

  1. 从菜单 “文件(File)”,选择导入(Import)
  2. 展开 Android, 选择 “Existing Android Code into Workspace”, 下一步。
  3. 浏览,选中刚才解压的的文件中的 frescolib 目录。
  4. 这5个项目应该被添加到工程: drawee, fbcore, fresco, imagepipeline, imagepipeline-base。请确认这5个项目一定是被选中的。点击完成。其他的项目参考之前 Gradle的额外依赖介绍。
  5. 右键,项目,选择属性,然后选择 Android。
  6. 点击右下角的 Add 按钮,选择 fresco,点击 OK,再点击 OK。

现在,fresco 就导入到项目中了,你可以开始编译了。如果编译不通过,可以尝试清理资源,或者重启 Eclipse。

如果你想在网络层使用 OkHttp,请看这里.

如果 support-v4 包重复了,删掉 frescolib/imagepipeline/libs 下的即可。

开始使用 Fresco

如果你仅仅是想简单下载一张网络图片,在下载完成之前,显示一张占位图,那么简单使用 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
  
    ...
    >
     android:name="android.permission.INTERNET" />
    
      ...
      android:label="@string/app_name"
      android:name=".MyApplication"
      >
      ...
    
    ...
  

在xml布局文件中, 加入命名空间:

1
2
3
4
5
6


    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    android:layout_height="match_parent"
    android:layout_width="match_parent">

加入SimpleDraweeView:

1
2
3
4
5
6

    android:id="@+id/my_image_view"
    android:layout_width="130dp"
    android:layout_height="130dp"
    fresco:placeholderImage="@drawable/my_drawable"
  />

开始加载图片:

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

Drawees 负责图片的呈现。它由三个元素组成,有点像MVC模式。

DraweeView

继承于 View, 负责图片的显示。

一般情况下,使用 SimpleDraweeView 即可。 你可以在 XML 或者在 Java 代码中使用它,通过 setImageUri 给它设置一个 URI 来使用,这里有简单的入门教学:开始使用

你可以使用 XML属性来达到各式各样的效果。

DraweeHierarchy

DraweeHierarchy 用于组织和维护最终绘制和呈现的 Drawable 对象,相当于MVC中的M。

你可以通过它来在Java代码中自定义图片的展示,具体的请参考这里: 在Java代码中自定义显示效果

DraweeController

DraweeController 负责和 image loader 交互( Fresco 中默认为 image pipeline, 当然你也可以指定别的),可以创建一个这个类的实例,来实现对所要显示的图片做更多的控制。

如果你还需要对Uri加载到的图片做一些额外的处理,那么你会需要这个类的。

DraweeControllerBuilder

DraweeControllers 由 DraweeControllerBuilder 采用 Builder 模式创建,创建之后,不可修改。具体参见: 使用ControllerBuilder。

Listeners

使用 ControllerListener 的一个场景就是设置一个 Listener监听图片的下载。

The Image Pipeline

Fresco 的 Image Pipeline 负责图片的获取和管理。图片可以来自远程服务器,本地文件,或者Content Provider,本地资源。压缩后的文件缓存在本地存储中,Bitmap数据缓存在内存中。

在5.0系统以下,Image Pipeline 使用 pinned purgeables 将Bitmap数据避开Java堆内存,存在ashmem中。这要求图片不使用时,要显式地释放内存。

SimpleDraweeView自动处理了这个释放过程,所以没有特殊情况,尽量使用SimpleDraweeView,在特殊的场合,如果有需要,也可以直接控制Image Pipeline。

支持的URI

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




















你可能感兴趣的:(Android)