Fresco图片加载

前言

在APP的开发中,避免不了加载图片,而因为安卓的某些性能限制,我们遇到最多的就是OOM异常,很讨厌的家伙!!之前一直在用UIL框架,后来该作者宣布不在维护,所以就转战Fresco了。

简介

网站:http://fresco-cn.org/

Fresco 是 Facebook 出品,他是新一代的图片加载库,我们知道 Android 应用程序可用的内存有限,经常会因为图片加载导致 OOM,虽然我们有各种手段去优化,尽量减少出现 OOM 的可能性,但是永远没法避免,尤其某些低端手机 OOM 更是严重。而 Facebook 就另辟蹊径,既然没法在 Java 层处理,我们就在更底层的 Native 堆做手脚。于是 Fresco 将图片放到一个特别的内存区域叫 Ashmem 区,就是属于 Native 堆,图片将不再占用 App 的内存,Java 层对此无能为力,这里是属于 C++ 的地盘,所以能大大的减少 OOM

看上去,很高大上。下面是一些简单的使用,本文是在AS的基础上使用,Eclipse的同学,建议赶紧换AS吧。


首先就是添加支持库

dependencies {
    compile 'com.facebook.fresco:fresco:0.12.0'
}

 
一定要记得初始化一般都是在Application中初始化 

public void onCreate() {
    super.onCreate();
    app = this;
    ToastUtils.init(this);
    //初始化
    Fresco.initialize(this);
}

 fresco框架加载图片,在xml布局中使用的就不在是ImageView了,而是替换成 
SimpleDraweeView 

因为使用到自定义属性,所以一定要添加上 

xmlns:fresco="http://schemas.android.com/apk/res-auto"

<com.facebook.drawee.view.SimpleDraweeView
    android:layout_marginTop="50dp"
    android:layout_gravity="center"
    android:id="@+id/my_image_view"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    fresco:actualImageScaleType="fitCenter"
    fresco:fadeDuration="1000"
    fresco:failureImage="@mipmap/failure"
    fresco:failureImageScaleType="centerInside"
    fresco:placeholderImage="@mipmap/zw"
    fresco:placeholderImageScaleType="fitCenter"
    fresco:progressBarAutoRotateInterval="5000"
    fresco:progressBarImage="@mipmap/loading"
    fresco:progressBarImageScaleType="centerInside"
    fresco:retryImage="@mipmap/reset"
    fresco:retryImageScaleType="centerCrop" />

我们先看如何加载图片,然后在说上面的属性。


private void initView() {
    image = (SimpleDraweeView) findViewById(R.id.my_image_view);
    Uri uri = Uri.parse("https://www.baidu.com/img/bd_logo1.png");
    image.setImageURI(uri);
}

上面我们可以看到,其中加载图片就是简单的一句代码,下面是效果图,我是以百度的LOGO的链接为例。




接下来我们就介绍下一些属性:

<com.facebook.drawee.view.SimpleDraweeView
    android:layout_width="match_parent"//与一般的控件一样也有同样的宽和高的属性,
    android:layout_height="200dp"      // 只不过不能使用wrap_content
    fresco:actualImageScaleType="fitCenter" // 图片的显示类型
    fresco:fadeDuration="1000"  //加载图片的动画时间
    fresco:failureImage="@mipmap/failure" //加载失败后显示的图片
    fresco:failureImageScaleType="centerInside"//加载失败后显示图片的类型
    fresco:placeholderImage="@mipmap/zw" //这个就是所谓的展位图,在图片加载完之前显示的
    fresco:placeholderImageScaleType="fitCenter"//展示图显示图片的类型
    fresco:progressBarAutoRotateInterval="5000"//加载过程
    fresco:progressBarImage="@mipmap/loading"//正在加载显示的图片
    fresco:progressBarImageScaleType="centerInside"//正在加载显示图片的类型
    fresco:retryImage="@mipmap/reset"//加载失败,点击重新加载显示的图片
    fresco:retryImageScaleType="centerCrop" />//重新加载显示的图片类型
上面就是基本使用的一些属性,如果用到重新加载需要设置 DraweeController,如下:

image = (SimpleDraweeView) findViewById(R.id.my_image_view);
Uri uri = Uri.parse("https://www.baidu.com/img/bd_logo1.png");
image.setImageURI(uri);
DraweeController draweeController = Fresco.newDraweeControllerBuilder().setUri(uri).setTapToRetryEnabled(true).setOldController(image.getController()).build();
image.setController(draweeController);

以上都是网络加载图片,最后奉上一些其他方式的加载方法

* 远程图片  http://, https://  HttpURLConnection
* 本地文件 file://    FileInputStream
* Content provider content:// ContentResolver
* asset目录下的资源  asset://   AssetManager
* res目录下的资源    res:// Resources.openRawResource
以本地文件为例:

image = (SimpleDraweeView) findViewById(R.id.my_image_view);
Uri uri = Uri.parse("file://"+ "图片路径");
image.setImageURI(uri);
DraweeController draweeController = Fresco.newDraweeControllerBuilder().setUri(uri).setTapToRetryEnabled(true).setOldController(image.getController()).build();
image.setController(draweeController);

这里就不上图了,有兴趣的同学可以试试。好了,Fresco的基本使用就说到这里。 谢谢


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灿烂的黑土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值