Android图片处理框架之Fresco学习使用

来源:互联网 发布:淘宝开店运营流程图 编辑:程序博客网 时间:2024/06/05 17:07

一、概述
1、介绍
Fresco是Facebook最新推出的一款用于Android应用中展示图片的强大图片库,可以从网络、本地存储和本地资源中加载图片。相对于ImageLoader,拥有更快的图片下载速度以及可以加载和显示gif图等诸多优势,是个很好的图片框架。并且比Glide和Picasso功能都强大。
2、Image Pipeline
Image Pipeline 的模块。它负责从网络,从本地文件系统,本地资源加载图片。为了最大限度节省空间和CPU时间,它含有3级缓存设计(2级内存,1级磁盘)。
3、Drawees
Drawees 负责在图片加载完成前显示占位图,加载成功后自动替换为目标图片。当图片不再显示在屏幕上时,它会及时地释放内存和空间占用。
4、特点
1)内存管理
内存分配采用:系统匿名共享内存
在5.0以下系统,Fresco将图片放到一个特别的内存区域。当然,在图片不显示的时候,占用的内存会自动被释放。这会使得APP更加流畅,减少因图片内存占用而引发的OOM。
2)渐进式呈现图片
渐进式图片格式先呈现大致的图片轮廓,然后随着图片下载的继续, 呈现逐渐清晰的图片,这对于移动设备,尤其是慢网络有极大的利好,可带来更好的用户体验。
3)支持加载Gif图,支持WebP格式。
4)图像的呈现

  • 自定义居中焦点(对人脸等图片显示非常有帮助)。
  • 圆角图,当然圆圈也行。
  • 下载失败之后,点击重新下载。
  • 自定义占位图,自定义overlay, 或者进度条。
  • 指定用户按压时的overlay。

5)图像的加载

  • 为同一个图片指定不同的远程路径,或者使用已经存在本地缓存中的图片。
  • 先显示一个低解析度的图片,等高清图下载完之后再显示高清图。
  • 加载完成回调通知。
  • 对于本地图,如有EXIF缩略图,在大图加载完成之前,可先显示缩略图。
  • 缩放或者旋转图片。
  • 处理已下载的图片。

5、官方参考
GitHub地址:https://github.com/facebook/fresco
使用文档地址:https://www.fresco-cn.org/docs/index.html

二、Demo
1、效果说明
本demo使用Fresco完成以下功能:
1) 基本使用

 Uri uri = Uri.parse("http://pic.qiantucdn.com/58pic/22/76/26/57d0ef9f30729_1024.jpg");        /*        Drawees 负责图片的呈现         */        SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);        draweeView.setImageURI(uri);

2)带进度条的图片

  SimpleDraweeView sdvFrescoSpimg = (SimpleDraweeView) findViewById(R.id.sdv_fresco_spimg);// 设置样式GenericDraweeHierarchyBuilder builder = new GenericDraweeHierarchyBuilder(getResources());GenericDraweeHierarchy hierarchy = builder.setProgressBarImage(new ProgressBarDrawable()).build(); sdvFrescoSpimg.setHierarchy(hierarchy);// 加载图片的地址Uri uri = Uri.parse("http://pic.qiantucdn.com/58pic/18/74/91/5652b24db9faf_1024.jpg");// 加载图片 sdvFrescoSpimg.setImageURI(uri);

3)图片的不同裁剪

  // 设置描述tvFrescoExplain.setText("居中,无缩放"); // 样式设置GenericDraweeHierarchy hierarchy = builder.setActualImageScaleType(ScalingUtils.ScaleType.CENTER).build(); // 图片显示imageDisplay(hierarchy);

4)圆形和圆角图片

     /**     * 设置圆形图片     */ public void fresco_circle(View view) {        // 设置圆形图片        parames = RoundingParams.asCircle();        GenericDraweeHierarchy hierarchy = builder.setRoundingParams(parames).build();        simpleDraweeView.setHierarchy(hierarchy);        simpleDraweeView.setImageURI(uri);    }    /**     * 设置圆角图片     */    public void fresco_corner(View view) {parames = RoundingParams.fromCornersRadius(50f);    parames.setOverlayColor(getResources().getColor(android.R.color.holo_red_light));//覆盖层      parames.setBorder(getResources().getColor(android.R.color.holo_blue_light), 5);//边框 GenericDraweeHierarchy hierarchy = builder.setRoundingParams(parames).build();simpleDraweeView.setHierarchy(hierarchy); // 加载图片 simpleDraweeView.setImageURI(uri);    }

5)渐进式展示图片

  // 获取图片请求ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri).setProgressiveRenderingEnabled(true).build(); DraweeController draweeController =Fresco .newDraweeControllerBuilder().setImageRequest(request).setTapToRetryEnabled(true)              .setOldController(sdvFrescoJpeg.getController())//使用oldController可以节省不必要的内存分配.build();// 设置加载的控制sdvFrescoJpeg.setController(draweeController);

6) GIF动画图片

 DraweeController controller = Fresco.newDraweeControllerBuilder()                .setUri(uri)                .setAutoPlayAnimations(false)                .setOldController(sdvFrescoGif.getController())                .build();        sdvFrescoGif.setController(controller); /**     * 停止动画     */    public void stopAnim(View view) {        Animatable animatable = sdvFrescoGif.getController().getAnimatable();        if (animatable != null && animatable.isRunning()) {            animatable.stop();        }    }    /**     * 开始动画     */    public void startAnim(View view) {        Animatable animatable = sdvFrescoGif.getController().getAnimatable();        if (animatable != null && !animatable.isRunning()) {            animatable.start();        }

7)多图请求及图片复用
8)图片缩放和旋转
9)修改图片
10)动态展示图片
这里写图片描述
2、demo地址:
https://github.com/TDCQZD/FrescoTest

三、如何使用?
1、依赖库

    //fresco依赖库    compile 'com.facebook.fresco:fresco:0.12.0'    // 在 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'

2、在全局变量Application初始化Fresco

public class MyApplication extends Application {    @Override    public void onCreate() {        super.onCreate();        Fresco.initialize(this);    }

配置AndroidManifest.xml
需要在 AndroidManifest.xml 中指定 Application 类,添加权限。

<uses-permission android:name="android.permission.INTERNET" />    <application        android:name=".MyApplication"        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:roundIcon="@mipmap/ic_launcher_round"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <activity android:name=".activity.FrescoActivity" />        <activity android:name=".activity.FrescoAutoSizeActivity" />        <activity android:name=".activity.FrescoCircleAndCornerActivity" />        <activity android:name=".activity.FrescoCropActivity" />        <activity android:name=".activity.FrescoSpimgActivity" />        <activity android:name=".activity.FrescoResizeActivity" />        <activity android:name=".activity.FrescoMultiActivity" />        <activity android:name=".activity.FrescoModifyActivity" />        <activity android:name=".activity.FrescoListenerActivity" />        <activity android:name=".activity.FrescoJpegActivity" />        <activity android:name=".activity.FrescoGifAcitivity" />    </application>

3、使用Drawees显示图片
/*
Drawees 负责图片的呈现
*/
SimpleDraweeView draweeView =
(SimpleDraweeView) findViewById(R.id.my_image_view);
draweeView.setImageURI(uri);

四、源码解析
推荐博客:
http://blog.csdn.net/column/details/master-fresco.html

结束语:
首先感谢尚硅谷无偿提供的学习资料。写博客是为了帮助开发者学习使用技术,同时巩固自己所学技术。如果此篇博客有助于您的学习,那是我的荣幸!如果此篇博客有任何瑕疵,请多多指教!在此感谢您的学习和指教!