设为首页 加入收藏

TOP

借鉴Glide思想二次封装Fresco(一)
2019-09-01 23:27:09 】 浏览:73
Tags:借鉴 Glide 思想 封装 Fresco

本篇文章已授权微信公众号 dasu_Android(大苏)独家发布

最近封装了个 Fresco 的组件库:DFresco,就顺便来讲讲。

背景

Fresco 图片库很强大,我们项目中就是使用的 Fresco,但有一点就是,不怎么好使用,略麻烦。不同项目中,多多少少都需要对 Fresco 进行一层封装才能在 ui 里快速使用。

这就导致了,不同项目都根据自己的业务需求场景来进行封装,每次有新项目,复制粘贴时又得解决好多业务耦合的错误,麻烦,是真的麻烦~

而且,首次接触 Fresco,接入上手的成本相比其他图片库,如 Glide,成本都要大很多。

举个例子,假如你有这么个需求:加载一张网络上的 gif 图片,为了防止内存占用过多,需要设置分辨率压缩,最后显示到圆形控件上,同时,需要设置占位图,错误图,拉伸方式等。

那么此时,你的代码可能就是这样的:

ImageDecodeOptions imageDecodeOptions = ImageDecodeOptions.newBuilder()
        .setDecodePreviewFrame(true).build();
ImageRequestBuilder builder = ImageRequestBuilder.newBuilderWithSource(mUri)
        .setProgressiveRenderingEnabled(true)
        .setImageDecodeOptions(imageDecodeOptions);
if (mWidth > 0 && mHeight > 0) {
    builder.setResizeOptions(new ResizeOptions(mWidth, mHeight));
}

ImageRequest request = builder.build();
AbstractDraweeController controller = Fresco.newDraweeControllerBuilder()
            .setImageRequest(request)
            .setControllerListener(listener)
            .setOldController(draweeView.getController())
            .setAutoPlayAnimations(true).build();
draweeView.setController(controller);

同时,你可能还需要在 xml 中对 SimpleDrawwView 控件进行占位图等等的配置:

<com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/sdv_fresco"
        android:layout_width="500dp"
        android:layout_height="500dp"
        fresco:actualImageScaleType="centerCrop"
        fresco:fadeDuration="3000"
        fresco:failureImage="@mipmap/ic_launcher"
        fresco:failureImageScaleType="centerCrop"
        fresco:placeholderImage="@mipmap/ic_launcher"
        fresco:placeholderImageScaleType="centerCrop"
        fresco:progressBarAutoRotateInterval="1000"
        fresco:progressBarImage="@drawable/ani_rotate"
        fresco:progressBarImageScaleType="centerCrop"
        fresco:retryImage="@mipmap/ic_launcher"
        fresco:retryImageScaleType="centerCrop"
        fresco:backgroundImage="@mipmap/ic_launcher"
        fresco:overlayImage="@mipmap/ic_launcher"
        fresco:pressedStateOverlayImage="@mipmap/ic_launcher"
        fresco:roundAsCircle="false"
        fresco:roundingBorderWidth="2dip"
        fresco:roundingBorderColor="@color/colorPrimary"/>

如果忘记了某个自定义属性名是什么的时候,还得到网上搜索下资料,是吧。

小结一下,使用 Fresco,你的接入学习成本至少需要知道 Fresco 的如下信息:

  • SimpleDraweeView 的自定义属性
  • ImageRequestBuilder 用法及大概用途
  • AbstractDraweeController 用法及大概用途
  • GenericDraweeHierarchy 用法及大概用途

如果涉及到一些网络下载监听,缓存之类的,那么你还要了解:

  • Imagepipeline 用法及大概用途

总之,Fresco 强大是强大,但使用起来不方便,不得不封装一层。

既然要封装,那么就直接借鉴 Glide 的使用思想来进行封装好了,如果有使用过 Glide 的应该很清楚,要实现以上功能,全程一个调用链即可。

二次封装

封装要达到的目的有两点:

  • 使用简洁、方便
  • 其他人接入直接上手的成本尽可能少,最好不用去看文档,去看源码

第一点可以参考 Glide 的使用方式来设计,那么第二点我的想法是借助 AndroidStudio 的代码提示功能来实现。

比如,你只需知道,组件的入口是 DFresco 即可,其他都通过 AndroidStudio 来给你提示,如:

Dfresco入口.png

当你在 AndroidStudio 上输入 DFresco. 后,界面上会弹出你可用 api,这些就是我开放给你的入口,我将这个使用过程划分成几个步骤,每个步骤能做什么,该做什么,我都给你规定好了,你参照着提示,直接从方法命名上就能够知道该如何使用了,AndroidStudio 会一步步引导你。

这里就两个入口,一个是用来初始化 Fresco 的:

  • init(Context)

这个内部封装了一些默认的初始化配置,比如内存大小配置,内部日志配置等等。

  • init(Context, ImagePipelineConfig)

这个是开放给你的自定义配置,如果你不想使用默认的配置的话。

  • source(String url) :加载网络上的图片
  • source(File localFile) :加载磁盘上的图片
  • source(Context context,
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Android 轮播图Banner切换图片的.. 下一篇win10的react native 开发环境搭..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目