概述

随着摄影技术的不断发展和普及,我们的应用程序大多数都具有显示图片这样的需求,在Android移动设备上,由于平台计算能力的差异、设备硬件的差异,我们很难将图片在不同的设备上完美地显示,经常出现的情况是一份展示图片的代码在高性能手机上运行很流畅,但是部署到硬件稍微差劲一点的设备上就会出现卡顿、占用内存比例过大、甚至应用崩溃的现象。所以我们最好能寻求一种框架,可以帮我们处理不同计算能力平台上的差异性,对图片的显示进行内存等方面的优化,使我们的应用可以在不同的设备上完美地显示图片,Fresco就是这样一个强大的图片加载组件,它是Facebook开发及开源的一个框架,通过Fresco,你不需要关心图片的加载和显示这些琐碎的事情,只需要告诉它要以何种方式显示图片即可,剩下的事情都交给它,真正体现了代码重用、避免重复造轮子的原则。

本文将带大家逐步入门Fresco的使用和基本特性,带大家体会使用Fresco的优点,本文不涉及过多Fresco源码部分及底层原理部分的内容,宗旨是先带大家入门,后面我会陆续推出关于Frecsco源码分析的文章,力争带大家深入Fresco的底层原理。

Fresco初步尝鲜

本节带大家一步一步通过Fresco显示一张网络图片,最终效果是这样的:

即在我们的手机上通过Fresco显示一张小熊熊的照片。

引入Fresco

Fresco官方github地址:https://github.com/facebook/fresco

使用所有开源库的第一步一定是引入相关依赖,将下面这行代码加入到Android项目的build.gradle(app)文件中即可:

implementation 'com.facebook.fresco:fresco:2.0.0'

上面的是Fresco的基本依赖,Fresco还提供了其他的一些高级功能,比如展示Gif之类的,为了控制库的大小,Fresco将这些子功能分开到其他子库中,大家按需添加即可:

dependencies {// 在 API < 14 上的机器支持 WebP 时,需要添加compile 'com.facebook.fresco:animated-base-support:2.0.0'// 如果要显示 GIF 动图,需要添加compile 'com.facebook.fresco:animated-gif:2.0.0'// 支持显示 WebP (静态图+动图)compile 'com.facebook.fresco:animated-webp:2.0.0'compile 'com.facebook.fresco:webpsupport:2.0.0'// 仅支持显示 WebP 静态图compile 'com.facebook.fresco:webpsupport:2.0.0'
}

使用Fresco

在使用Fresco之前,我们需要在我们的应用中初始化Fresco,初始化的代码为:

Fresco.initialize(this);

那么这行代码应该写在我们应用的什么位置?Fresco官方的说法是,Fresco的初始化工作在整个应用的生命周期只需要初始化一次,多次初始化没有任何意义,联想一下,什么地方的代码在整个应用的生命周期只会执行一次?答案是应用ApplicationonCreate()方法啊,所以我们新建一个Application并初始化Fresco

package edu.nuaa.aiexception.learnopensource;import android.app.Application;import com.facebook.drawee.backends.pipeline.Fresco;/*** @author dmrfcoder* @date 2019-06-30*/public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();Fresco.initialize(this);}
}

不要忘记在项目的Manifest文件中指定Application

 <applicationandroid:name=".MyApplication".../>

至此,Fresco已经初始化好了。

我们需要从网络加载图片,所以必须要在Manifest文件中为应用加上网络请求的权限:

 <uses-permission android:name="android.permission.INTERNET"/>

然后我们需要在界面上放置一个Fresco的控件,因为我们仅仅是想简单下载一张网络图片,在下载完成之前,显示一张占位图,可以使用最简单的 SimpleDraweeView

 <com.facebook.drawee.view.SimpleDraweeViewandroid:id="@+id/fresco_view"android:layout_width="130dp"android:layout_height="130dp"android:layout_centerHorizontal="true"app:placeholderImage="@mipmap/ic_launcher" />

然后我们就可以在Java代码中为SimpleDraweeView设置图像了:

public void loadPicFromNet() {Uri uri = Uri.parse("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=2133031131,1997928181&fm=26&gp=0.jpg");imageView.setImageURI(uri);
}

然后直接运行代码,这里笔者运行的时候遇到了如下报错:

java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/core/util/Pools$SynchronizedPool;

解决方案是在你项目的gradle.properties文件中加入如下两行即可:

android.enableJetifier = true
android.useAndroidX=true

希望可以帮大家避坑。

然后运行代码,最终效果如下:

可以看到,在图片从网络上下载下来之前,会展示我们设置的占位图,当图片下载完成之后,Fresco才会将下载下来的图片显示到屏幕上,这样用户体验会更好。

总结一下,在上例中,Fresco替我们完成的事情有:

剩下的,Fresco会替你完成:

  • 显示占位图直到加载完成;
  • 下载图片;
  • 缓存图片;
  • 图片不再显示时,从内存中移除

可以看到,通过Fresco的使用,我们不再需要关心图片的下载、缓存、清除等一系列事件,只需要关注图片的显示即可,将我们的意图描述给Fresco,剩下的事情都由它来完成,是不是很方便啊~

Fresco中的几个关键概念

Drawees

Drawees的作用是在图片加载完成前显示占位图,加载成功后自动替换为目标图片。当图片不再显示在屏幕上时,它会及时地释放内存和空间占用

Drawees由三个元素组成,有点像MVC模式,分别是:

DraweeView

继承于 View, 负责图片的显示。

一般情况下,使用 SimpleDraweeView 即可。 你可以在 XML 或者在 Java 代码中使用它,通过 setImageUri 给它设置一个 URI 来使用,上面的实例就是借助SimpleDraweeView来实现的网络图片显示。

我们可以设置DraweeViewXML属性来达到各式各样的效果,这一点我会在下面详细讲解。

DraweeHierarchy

DraweeHierarchy 用于组织和维护最终绘制和呈现的Drawable对象,相当于MVC中的M

你可以通过它来在Java代码中自定义图片的展示。

DraweeController

DraweeController 负责和 image loader 交互( Fresco 中默认为 image pipeline, 当然你也可以指定别的),可以创建一个这个类的实例,来实现对所要显示的图片做更多的控制。

如果你还需要对Uri加载到的图片做一些额外的处理,那么你会需要这个类的。

DraweeControllerBuilder

DraweeControllersDraweeControllerBuilder 采用 Builder 模式创建,创建之后,不可修改。

Listeners

使用 ControllerListener 的一个场景就是设置一个Listener监听图片的下载。

The Image Pipeline

FrescoImage Pipeline 负责图片的获取和管理。图片可以来自远程服务器,本地文件,或者Content Provider,本地资源。压缩后的文件缓存在本地存储中,Bitmap数据缓存在内存中。

在5.0系统以下,Image Pipeline 使用 pinned purgeablesBitmap数据避开Java堆内存,存在ashmem中。这要求图片不使用时,要显式地释放内存。

SimpleDraweeView自动处理了这个释放过程,所以没有特殊情况,尽量使用SimpleDraweeView,在特殊的场合,如果有需要,也可以直接控制Image Pipeline

Fresco都支持哪些类型的URL?

Fresco 支持许多URI格式。

特别注意:Fresco 不支持 相对路径的URI. 所有的 URI 都必须是绝对路径,并且带上该 URIscheme

如下:

类型 SCHEME 示例
远程图片 http://, https:// HttpURLConnection
本地文件 file:// FileInputStream
Content provider content:// ContentResolver
asset目录下的资源 asset:// AssetManager
res目录下的资源 res:// Resources.openRawResource
Uri中指定图片数据 data:mime/type;base64, 数据类型必须符合rfc2397规定(仅支持 UTF-8)

res 示例:

Uri uri = Uri.parse("res://包名(实际可以是任何字符串甚至留空)/" + R.drawable.ic_launcher);

注意,只有图片资源才能使用在Image pipeline中,比如(PNG)。其他资源类型,比如字符串,或者XML DrawableImage pipeline中没有意义。所以加载的资源不支持这些类型。

ShapeDrawable这样声明在XML中的drawable可能引起困惑。注意到这毕竟不是图片。如果想把这样的drawable作为图像显示,那么把这个drawable设置为占位图,然后把URI设置为null

总结

本文我们通过一个实例带大家过了一遍Fresco的基本使用流程,并且对Fresco中的基本概念做了简单介绍,由于Fresco DraweeFresco Image PipelineFresco比较重要,且知识点比较繁杂,我会在最近分别就DraweeImage PipelineFresco做详细介绍,届时将向大家展示一些Fresco的高级用法,欢迎大家关注。

Fresco入门使用及简单特性介绍相关推荐

  1. [Echarts可视化] 一.入门篇之简单绘制中国地图和贵州地区

    最近发生了很多事情,去到了一个新环境学习.但是不论在哪里,我都需要不忘初心,坚持做自己喜欢的事情,在CSDN写博客.教学.爱娜.生活等等.         这篇文章主要是通过Echarts可视化介绍入 ...

  2. VAPS XT开发入门教程00:基本介绍

    昨天(2021.10.12)到某研究所对其人员进行培训,发现一些问题,经过整理之后,形成本文比较系统化的培训流程. 当然,如果需要打补丁,本文会更新. VAPS XT介绍 VAPS XT基于PC机的人 ...

  3. Fresco图片加载框架的介绍,相关开源库以及工具类的封装

    Fresco图片加载框架的介绍,相关开源库以及工具类的封装 本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发. 简介 Fresco 是Facebook开源的安卓上的 ...

  4. GitHub 上排名前 100 的 Android 开源库进行简单的介绍

    本文转载于:https://github.com/Freelander/Android_Data/blob/master/Android-Librarys-Top-100.md 本项目主要对目前 Gi ...

  5. 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍

    GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...

  6. JDO 的架构作一个简单的介绍

    JDO快速入门 Java数据对象(Java Data Objects,JDO)是一个应用程序接口(API),它是Java程序员能够间接地访问数据库,也就是说,不需使用直接的结构化查询语言(SQL)语句 ...

  7. 前端每周清单第 33 期:React 16 发布与特性介绍,Expo AR 教程,ExtJS 从崛起到沉寂...

    前端每周清单专注前端领域内容,以对外文资料的搜集为主,帮助开发者了解一周前端热点:分为新闻热点.开发教程.工程实践.深度阅读.开源项目.巅峰人生等栏目.欢迎关注[前端之巅]微信公众号(ID:front ...

  8. SAP PI 7.3新特性介绍

    PI 7.3新特性介绍 自从SAP TechEd  2010 年在Berlin对PI7.3的新特性作了介绍之后,类似于single Java Stack, central monitoring, ID ...

  9. Arduino可穿戴开发入门教程Arduino开发环境介绍

    Arduino可穿戴开发入门教程Arduino开发环境介绍 Arduino开发环境介绍 Arduino不像我们使用的PC端操作系统一样,可以直接在操作系统中安装软件为操作系统编程.Arduino的软件 ...

最新文章

  1. PyTorch-Adam优化算法原理,公式,应用
  2. 读javascript高级程序设计03-函数表达式、闭包、私有变量
  3. 量子纠缠buff加持,雷达精度提高500倍,论文已登物理顶刊
  4. 质数,约数(数论) AcWing算法课
  5. hisi mmz内存管理
  6. 信息系统服务器数量设置,《系统下服务器设置与优化.doc
  7. RabbitMq如何确保消息不丢失
  8. 机器学习理论知识部分--偏差方差平衡(bias-variance tradeoff)
  9. 你解决的问题比你编写的代码更重要! 1
  10. 编程猫海龟编辑器python_海龟编辑器下载
  11. excel线性拟合的斜率_excle指定斜率拟合 | 用Excel如何进行最小二乘法的线性拟合?求图解!...
  12. 一文掌握字符串之正则表达式,值得收藏!
  13. 2022保研夏令营/预推免记录:浙大计院直博/西湖电子直博/南大软院/厦大信院
  14. 颜色格式转换: FFmpeg源代码简单分析:libswscale的sws_getContext()
  15. WORD文档无法编辑解决
  16. 第十六周学习周报20181224-20181230
  17. 湖北计算机二级考试时间安排,湖北3月计算机二级考试时间安排
  18. 安装Dev c++后,编译文件出现未编译的解决方法
  19. php识别图片的条码,如何用php实现生成条形码图片
  20. dash dock安装 to_手动安装 Dash to Dock Gnome 扩展

热门文章

  1. vue + element 谷歌浏览器调用电脑摄像头拍照
  2. 豪华钟表江诗丹顿将使用区块链溯源
  3. RISC-V共建 | openKylin与深度数智战略合作会议召开
  4. COBOL--02--案例1
  5. onchange监听input值变化及input隐藏后change事件不触发的原因与解决方法(设置readonly后onchange不起作用的解决方案)...
  6. ubuntu18 + QT + 动态库创建和调用+Plain C++ Aplication
  7. ubuntu安装 QT5.14.2
  8. 21世纪,计算机的普及与互联网的发展,推进服装企业信息化时代
  9. 【每日新闻】浪潮发布云计算战略 3.0,打造平台生态型企业 | 复旦开创新存储技术:10纳秒写入速度,可定制有效期
  10. java 字符串将每两位用英文逗号分隔开