Android图片加载框架哪家强?当然是FaceBook出品的Fresco
suiw9 2024-10-29 16:45 47 浏览 0 评论
概述
屏幕快照 2019-06-30 17.00.20
随着摄影技术的不断发展和普及,我们的应用程序大多数都具有显示图片这样的需求,在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的初始化工作在整个应用的生命周期只需要初始化一次,多次初始化没有任何意义,联想一下,什么地方的代码在整个应用的生命周期只会执行一次?答案是应用Application的onCreate()方法啊,所以我们新建一个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 { @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); } }
不要忘记在项目的Manifest文件中指定Application:
<application android:name=".MyApplication" ... />
至此,Fresco已经初始化好了。
我们需要从网络加载图片,所以必须要在Manifest文件中为应用加上网络请求的权限:
<uses-permission android:name="android.permission.INTERNET"/>
然后我们需要在界面上放置一个Fresco的控件,因为我们仅仅是想简单下载一张网络图片,在下载完成之前,显示一张占位图,可以使用最简单的 SimpleDraweeView:
<com.facebook.drawee.view.SimpleDraweeView android: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来实现的网络图片显示。
我们可以设置DraweeView的XML属性来达到各式各样的效果,这一点我会在下面详细讲解。
DraweeHierarchy
DraweeHierarchy 用于组织和维护最终绘制和呈现的Drawable对象,相当于MVC中的M。
你可以通过它来在Java代码中自定义图片的展示。
DraweeController
DraweeController 负责和 image loader 交互( Fresco 中默认为 image pipeline, 当然你也可以指定别的),可以创建一个这个类的实例,来实现对所要显示的图片做更多的控制。
如果你还需要对Uri加载到的图片做一些额外的处理,那么你会需要这个类的。
DraweeControllerBuilder
DraweeControllers 由 DraweeControllerBuilder 采用 Builder 模式创建,创建之后,不可修改。
Listeners
使用 ControllerListener 的一个场景就是设置一个Listener监听图片的下载。
The Image Pipeline
Fresco 的 Image Pipeline 负责图片的获取和管理。图片可以来自远程服务器,本地文件,或者Content Provider,本地资源。压缩后的文件缓存在本地存储中,Bitmap数据缓存在内存中。
在5.0系统以下,Image Pipeline 使用 pinned purgeables 将Bitmap数据避开Java堆内存,存在ashmem中。这要求图片不使用时,要显式地释放内存。
SimpleDraweeView自动处理了这个释放过程,所以没有特殊情况,尽量使用SimpleDraweeView,在特殊的场合,如果有需要,也可以直接控制Image Pipeline。
Fresco都支持哪些类型的URL?
Fresco 支持许多URI格式。
特别注意:Fresco 不支持 相对路径的URI. 所有的 URI 都必须是绝对路径,并且带上该 URI 的 scheme。
如下:
res 示例:
Uri uri = Uri.parse("res://包名(实际可以是任何字符串甚至留空)/" + R.drawable.ic_launcher);
注意,只有图片资源才能使用在Image pipeline中,比如(PNG)。其他资源类型,比如字符串,或者XML Drawable在Image pipeline中没有意义。所以加载的资源不支持这些类型。
像ShapeDrawable这样声明在XML中的drawable可能引起困惑。注意到这毕竟不是图片。如果想把这样的drawable作为图像显示,那么把这个drawable设置为占位图,然后把URI设置为null。
总结
本文我们通过一个实例带大家过了一遍Fresco的基本使用流程,并且对Fresco中的基本概念做了简单介绍,由于Fresco Drawee和Fresco Image PipelineFresco比较重要,且知识点比较繁杂,我会在最近分别就Drawee和 Image PipelineFresco做详细介绍,届时将向大家展示一些Fresco的高级用法,欢迎大家关注。
相关推荐
- 5款Syslog集中系统日志常用工具对比推荐
-
一、为何要集中管理Syslog?Syslog由Linux/Unix系统及其他网络设备生成,广泛分布于整个网络。因其包含关键信息,可用于识别网络中的恶意活动,所以必须对其进行持续监控。将Sys...
- 跨平台、多数据库支持的开源数据库管理工具——DBeaver
-
简介今天给大家推荐一个开源的数据库管理工具——DBeaver。它支持多种数据库系统,包括Mysql、Oracle、PostgreSQL、SLQLite、SQLServer等。DBeaver的界面友好...
- 强烈推荐!数据库管理工具:Navicat Premium 16.3.2 (64位)
-
NavicatPremium,一款集数据迁移、数据库管理、SQL/查询编辑、智能设计、高效协作于一体的全能数据库开发工具。无论你是MySQL、MariaDB、MongoDB、SQLServer、O...
- 3 年 Java 程序员还玩不转 MongoDB,网友:失望
-
一、什么场景使用MongoDB?...
- 拯救MongoDB管理员的GUI工具大赏:从菜鸟到极客的生存指南
-
作为一名在NoSQL丛林中披荆斩棘的数据猎人,没有比GUI工具更称手的瑞士军刀了。本文将带你围观五款主流MongoDB管理神器的特性与暗坑,附赠精准到扎心的吐槽指南一、MongoDBCompass:...
- mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?
-
前言最近在做neo4j相关的同步处理,因为产线的可视化工具短暂不可用,发现写起来各种脚本非常麻烦。...
- solidworks使用心得,纯干货!建议大家收藏
-
SolidWorks常见问题...
- 统一规约-关乎数字化的真正实现(规范统一性)
-
尽管数字化转型的浪潮如此深入人心,但是,对于OPCUA和TSN的了解却又甚少,这难免让人质疑其可实现性,因为,如果缺乏统一的语义互操作规范,以及更为具有广泛适用的网络与通信,则数字化实际上几乎难以具...
- Elasticsearch节点角色配置详解(Node)
-
本篇文章将介绍如下内容:节点角色简介...
- 产前母婴用品分享 篇一:我的母婴购物清单及单品推荐
-
作者:DaisyH8746在张大妈上已经混迹很久了,有事没事看看“什么值得买”已渐渐成了一种生活习惯,然而却从来没有想过自己要写篇文章发布上来,直到由于我产前功课做得“太过认真”(认真到都有点过了,...
- 比任何人都光彩照人的假期!水润、紧致的肌肤护理程序
-
图片来源:谜尚愉快的假期临近了。身心振奋的休假季节。但是不能因为这种心情而失去珍贵的东西,那就是皮肤健康。炙热的阳光和强烈的紫外线是使我们皮肤老化的主犯。因此,如果怀着快乐的心情对皮肤置之不理,就会使...
- Arm发布Armv9边缘AI计算平台,支持运行超10亿参数端侧AI模型
-
中关村在线2月27日消息,Arm正式发布Armv9边缘人工智能(AI)计算平台。据悉,该平台以全新的ArmCortex-A320CPU和领先的边缘AI加速器ArmEthos-U85NPU为核心...
- 柔性——面向大规模定制生产的数字化实现的基本特征
-
大规模定制生产模式的核心是柔性,尤其是体现在其对定制的要求方面。既然是定制,并且是大规模的定制,对于制造系统的柔性以及借助于数字化手段实现的柔性,就提出了更高的要求。面向大规模定制生产的数字化业务管控...
- 创建PLC内部标准——企业前进的道路
-
作者:FrankBurger...
- 标准化编程之 ----------- 西门子LPMLV30测试总结
-
PackML乃是由OMAC开发且被ISA所采用的自动化标准TR88.00.02,能够更为便捷地传输与检索一致的机器数据。PackML的主要宗旨在于于整个工厂车间倡导通用的“外观和感觉”,...
你 发表评论:
欢迎- 一周热门
-
-
Linux:Ubuntu22.04上安装python3.11,简单易上手
-
宝马阿布达比分公司推出独特M4升级套件,整套升级约在20万
-
MATLAB中图片保存的五种方法(一)(matlab中保存图片命令)
-
别再傻傻搞不清楚Workstation Player和Workstation Pro的区别了
-
Linux上使用tinyproxy快速搭建HTTP/HTTPS代理器
-
如何提取、修改、强刷A卡bios a卡刷bios工具
-
Element Plus 的 Dialog 组件实现点击遮罩层不关闭对话框
-
日本组合“岚”将于2020年12月31日停止团体活动
-
SpringCloud OpenFeign 使用 okhttp 发送 HTTP 请求与 HTTP/2 探索
-
tinymce 号称富文本编辑器世界第一,大家同意么?
-
- 最近发表
-
- 5款Syslog集中系统日志常用工具对比推荐
- 跨平台、多数据库支持的开源数据库管理工具——DBeaver
- 强烈推荐!数据库管理工具:Navicat Premium 16.3.2 (64位)
- 3 年 Java 程序员还玩不转 MongoDB,网友:失望
- 拯救MongoDB管理员的GUI工具大赏:从菜鸟到极客的生存指南
- mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?
- solidworks使用心得,纯干货!建议大家收藏
- 统一规约-关乎数字化的真正实现(规范统一性)
- Elasticsearch节点角色配置详解(Node)
- 产前母婴用品分享 篇一:我的母婴购物清单及单品推荐
- 标签列表
-
- dialog.js (57)
- importnew (44)
- windows93网页版 (44)
- yii2框架的优缺点 (45)
- tinyeditor (45)
- qt5.5 (60)
- windowsserver2016镜像下载 (52)
- okhttputils (51)
- android-gif-drawable (53)
- 时间轴插件 (56)
- docker systemd (65)
- slider.js (47)
- android webview缓存 (46)
- pagination.js (59)
- loadjs (62)
- openssl1.0.2 (48)
- velocity模板引擎 (48)
- pcre library (47)
- zabbix微信报警脚本 (63)
- jnetpcap (49)
- pdfrenderer (43)
- fastutil (48)
- uinavigationcontroller (53)
- bitbucket.org (44)
- python websocket-client (47)