前言
在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的基本使用就说到这里。 谢谢