Fresco是Facebook最新推出的一款用于Android应用中展示图片的强大图片库,可以从网络、本地存储和本地资源中加载图片。其中的Drawees可以显示占位符,直到图片加载完成。而当图片从屏幕上消失时,会自动释放内存。

Fresco是Facebook开源Android平台上一个强大的图片加载库,也是迄今为止Android平台上最强大的图片加载库。

Fresco 是一个强大的图片加载组件。使用它之后,你不需要再去关心图片的加载和显示这些繁琐的事情! 支持 Android 2.3 及以后的版本。

Fresco源码:https://github.com/facebook/fresco

Fresco官方文档(中文):https://www.fresco-cn.org/

Fresco源码在线查看:http://frescolib.org/javadoc/reference/packages.html

gradle引入(当然你也可以引入 高版本)

   compile 'com.facebook.fresco:fresco:0.12.0'
// 支持 GIF 动图,需要添加
compile 'com.facebook.fresco:animated-gif:0.12.0'

运行效果图:(注:此案例只完成了图中相应功能,Fresco更多功能去官方查看,讲解详细)

      

特性

1:内存管理

解压后的图片,即Android中的Bitmap,占用大量的内存。大的内存占用势必引发更加频繁的GC。在5.0以下,GC将会显著地引发界面卡顿。

在5.0以下系统,Fresco将图片放到一个特别的内存区域。当然,在图片不显示的时候,占用的内存会自动被释放。这会使得APP更加流畅,减少因图片内存占用而引发的OOM。

Fresco 在低端机器上表现一样出色,你再也不用因图片内存占用而思前想后。

2:图片加载

Fresco的Image Pipeline允许你用很多种方式来自定义图片加载过程,比如:

  • 为同一个图片指定不同的远程路径,或者使用已经存在本地缓存中的图片
  • 先显示一个低清晰度的图片,等高清图下载完之后再显示高清图
  • 加载完成回调通知
  • 对于本地图,如有EXIF缩略图,在大图加载完成之前,可先显示缩略图
  • 缩放或者旋转图片
  • 对已下载的图片再次处理
  • 支持WebP解码,即使在早先对WebP支持不完善的Android系统上也能正常使用!

3:图片绘制

Fresco 的 Drawees 设计,带来一些有用的特性:

  • 自定义居中焦点
  • 圆角图,当然圆圈也行
  • 下载失败之后,点击重现下载
  • 自定义占位图,自定义overlay, 或者进度条
  • 指定用户按压时的overlay

4:图片的渐进式呈现

渐进式的JPEG图片格式已经流行数年了,渐进式图片格式先呈现大致的图片轮廓,然后随着图片下载的继续,呈现逐渐清晰的图片,这对于移动设备,尤其是慢网络有极大的利好,可带来更好的用户体验。

Android 本身的图片库不支持此格式,但是Fresco支持。使用时,和往常一样,仅仅需要提供一个图片的URI即可,剩下的事情,Fresco会处理

5:动图加载

加载Gif图和WebP动图在任何一个Android开发者眼里看来都是一件非常头疼的事情。每一帧都是一张很大的Bitmap,每一个动画都有很多帧。Fresco让你没有这些烦恼,它处理好每一帧并管理好你的内存。

代码:(属性可根据需要设置  注:android:layout_height="200dp" 的属性值不能为:wrap_content)

 <!--  fresco:actualImageScaleType:实际加载的图片的伸缩样式
fresco:backgroundImage:底层图片资源
fresco:fadeDuration:进度条和占位符图片逐渐消失、加载的图片逐渐显示的时间间隔
fresco:failureImage:加载失败时显示的图片资源
fresco:failureImageScaleType:加载失败时加载的图片的伸缩样式
fresco:overlayImage:在显示的图片表层覆盖一张图片的图片资源
fresco:placeholderImage:占位符图片资源
fresco:placeholderImageScaleType:占位符图片的伸缩样式
fresco:progressBarAutoRotateInterval:进度条图片转动周期
fresco:progressBarImage:进度条图片资源
fresco:progressBarImageScaleType:进度条图片的伸缩样式
fresco:retryImage:提示重新加载的图片资源
fresco:retryImageScaleType:提示重新加载的图片的伸缩样式
fresco:roundAsCircle:将图片剪切成圆形
fresco:viewAspectRatio:图片宽高比--> <com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/id_main_sdv_sdv"
android:layout_width="match_parent"
android:layout_height="200dp"
fresco:actualImageScaleType="focusCrop"
fresco:fadeDuration="3000"
fresco:failureImage="@mipmap/ic_launcher"
fresco:failureImageScaleType="centerInside"
fresco:placeholderImage="@mipmap/ic_launcher"
fresco:placeholderImageScaleType="fitCenter"
fresco:progressBarAutoRotateInterval="1000"
fresco:progressBarImage="@drawable/aa"
fresco:progressBarImageScaleType="centerInside"
fresco:retryImage="@mipmap/ic_launcher"
fresco:retryImageScaleType="centerCrop"
fresco:roundAsCircle="false"
fresco:viewAspectRatio="1.6" />

加载方式1:

  SimpleDraweeView sdv = (SimpleDraweeView) findViewById(R.id.id_main_sdv_sdv);
Uri uri = Uri.parse("http://image5.tuku.cn/pic/wallpaper/fengjing/menghuandaziranmeijingbizhi/009.jpg");
sdv.setImageURI(uri);

加载方式2:

 SimpleDraweeView sdv2 = (SimpleDraweeView) findViewById(R.id.id_main_sdv_sdv2);
sdv2.setImageURI("http://img.my.csdn.net/uploads/201407/26/1406383243_5120.jpg");

加载方式3:

 simpleDraweeView1 = (SimpleDraweeView) findViewById(R.id.user_avator);
simpleDraweeView1.setController(Fresco.newDraweeControllerBuilder()
.setImageRequest(
ImageRequestBuilder.newBuilderWithSource(
Uri.parse("http://avatar.csdn.net/8/6/0/1_dickyqie.jpg"))
.setProgressiveRenderingEnabled(true)
.build())
.setOldController(simpleDraweeView1.getController())
.build());

加载方式gif图片:

 Uri uri = Uri.parse("http://ww1.sinaimg.cn/mw600/6345d84ejw1dvxp9dioykg.gif");
simpleDraweeView2 = (SimpleDraweeView) findViewById(R.id.user_avator2);
DraweeController draweeController1 = Fresco.newDraweeControllerBuilder().setUri(uri).setAutoPlayAnimations(true).build();
simpleDraweeView2.setController(draweeController1);
simpleDraweeView2.setOnTouchListener(this);

代码设置属性:

 // 代码设置SimpleDraweeView的属性(会覆盖XML设置的所有属性,即在XML中有在这里没有的属性都会失效)
// 注意:一个GenericDraweeHierarchy是不能被多个SimpleDraweeView共用的
SimpleDraweeView sdv = (SimpleDraweeView) findViewById(R.id.id_main_sdv_sdv);
GenericDraweeHierarchy hierarchy = new GenericDraweeHierarchyBuilder(getResources())
.setFadeDuration(3000)
.setPlaceholderImage(R.mipmap.ic_launcher)
.setPlaceholderImageScaleType(ScalingUtils.ScaleType.FIT_XY)
.setProgressBarImage(new ProgressBarDrawable()) // 显示进度条(Fresco自带的进度条)
.build();
// 设置图片圆角
RoundingParams roundingParams = new RoundingParams();
roundingParams.setRoundAsCircle(false); // 不将图片剪切成圆形
roundingParams.setCornersRadius(200);
hierarchy.setRoundingParams(roundingParams);
sdv.setHierarchy(hierarchy);
 
 
 

源码点击下载:https://github.com/DickyQie/android-network-image-loading

其他网络图片加载方式,请看

Android之网络图片加载的5种模式

Android之网络图片框架UniversalImageLoader和结合LruCache缓存图片

Android图片加载框架之Picasso非常好的图片加载缓存库

Android之Glide(非常好用的图片加载框架)

 

Android之Fresco(facebook的强大Android图片加载的框架)的更多相关文章

  1. Fresco,Facbook强大的图片加载框架

    项目git地址:https://github.com/facebook/fresco Fresco是 facebook推出的一款强大的图片加载的框架:主要有Image Pipeline和Drawees ...

  2. Android Handler 异步消息处理机制的妙用 创建强大的图片加载类(转)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38476887 ,本文出自[张鸿洋的博客] 最近创建了一个群,方便大家交流,群号: ...

  3. 强大的图片加载框架Fresco的使用

    前面在卓新科技有限公司实习的时候,在自己的爱吖头条APP中,在图片异步加载的时候和ListView的滑动中,总会出现卡顿,这是因为图片的缓存做的不是足够到位,在项目监理的帮助下,有使用Xutils框架 ...

  4. Android开发三种第三方图片加载的框架

    最近在项目中用到了大量图片加载,第三方优秀框架还不错,下面介绍三款榜首的框架用法和问题,做一个记录. 现在项目使用的是Android Studio开发的,现在也没有多少人使用Eclipse了吧. 一. ...

  5. Android开源库--Universal Image Loader通用图片加载器

    如果说我比别人看得更远些,那是因为我站在了巨人的肩上.   github地址:https://github.com/nostra13/Android-Universal-Image-Loader 介绍 ...

  6. 037 Android Glide图片加载开源框架使用

    1.Glide简单介绍 Glide是一款由Bump Technologies开发的图片加载框架,使得我们可以在Android平台上以极度简单的方式加载和展示图片.Glide是一个快速高效的Androi ...

  7. iOS图片加载新框架 - FlyImage

    FlyImage 整合了SDWebImage,FastImageCache,AFNetworking的优点,是一个新的性能高效.接口简单的图片加载框架. 特点 高效 可将多张小图解码后存储到同一张大图 ...

  8. Android中用URL模拟一个简单的图片加载器

    首先,需要添加权限. <uses-permission android:name="android.permission.INTERNET"/> 整体代码如下: pac ...

  9. Android图片加载库的理解

    前言     这是“基础自测”系列的第三篇文章,以Android开发需要熟悉的20个技术点为切入点,本篇重点讲讲Android中的ImageLoader这个库的一些理解,在Android上最让人头疼是 ...

随机推荐

  1. 牛客网多校赛第七场--C Bit Compression【位运算】【暴力】

    链接:https://www.nowcoder.com/acm/contest/145/C 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524 ...

  2. 项目无法运行iPhone5模拟器

    公司没有iPhone5真机, 有人反馈iPhone5有bug, 只能用模拟器验证bug, 但是使用iPhone5项目编译不过,报错: 注释掉相关引用代码,去掉 库

  3. Ubuntu下安装Nginx详细步骤

    Nginx安装之前需要三个支持: 模块依赖性 ①gzip 模块需要 zlib 库 ②rewrite 模块需要 pcre 库 ③ssl 功能需要 openssl 库 预先编译好的包: sudo apt- ...

  4. 爬虫之BeautifulSoup

    BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后便可以使用他提供的方法进行快速查找指定元素,从而使得在HTML或XML中查找指定元素变得简单. ...

  5. 预训练模型与Keras.applications.models权重资源地址

    什么是预训练模型 简单来说,预训练模型(pre-trained model)是前人为了解决类似问题所创造出来的模型.你在解决问题的时候,不用从零开始训练一个新模型,可以从在类似问题中训练过的模型入手. ...

  6. 用nginx的反向代理机制解决前端跨域问题在nginx上部署web静态页面

    用nginx的反向代理机制解决前端跨域问题在nginx上部署web静态页面 1.什么是跨域以及产生原因 跨域是指a页面想获取b页面资源,如果a.b页面的协议.域名.端口.子域名不同,或是a页面为ip地 ...

  7. php获取目录下所有文件路径(递归)

    <?php function tree(&$arr_file, $directory, $dir_name='') { $mydir = dir($directory); while($ ...

  8. expdp&impdp备份恢复常用命令

    备份前准备 创建备份用户 create user backup identified by backup#2018 ; 授予导入导出角色 grant connect,resource to backu ...

  9. Know that more adidas NMD Singapore colorways are coming

    The adidas NMD Singapore continues to be the right silhouette for summer time because of a mix of a ...

  10. 4.11 Routing -- Loading/Error Substates

    除了在上节中描述的技术,Ember路由器通过使用error和loading substates为自定义异步跳转提供强大而可重写的约定. 一.loading Substates 1. 在跳转过程中,Em ...