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

一、概述
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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值