Android图片加载框架Fresco解析

Android常用开源库(模块部分) 创建Glide的主要目的有两个,一个是实现平滑的图片列表滚动效果,另一个是支持远程图片的获取、大小调整和展示。OkHttp是对Http协议的高度封装,支持get请求和post请求,支持基于Http的文件上传和下载,支持加载图片,支持下载文件透明的GZIP压缩,支持响应缓存避免重复的网络请求,支持使用连接池来降低响应延迟问题。Volley和Retrofit一样,也是一个网络请求框架,以通过它访问普通的网络数据,如JSON格式的数据,也可以下载图片。内部集成了OkHttp的网络框架(毕竟都是一家的产品)。 阅读详情

Android图片加载框架Fresco解析

标签(空格分隔): Android 框架 图片


与ImageLoader不同,Facebook的开源框架的加载方式决定了,更低的内存使用,更高的可定制性。


Fresco原理

设计一个Image Pipeline的概念,负责先检查内存,磁盘文件,如果都不存在则从给的Url中下载。
Fresco有三个线程池,其中,三个线程用于网络下载图片,2个线程用于磁盘文件的读写,还有两个线程负责CPU相关操作(解码,转换)等。


Drawees模块
它会在图片加载完成前显示占位图,加载成功后自动替换为目标图片。当图片不再显示在屏幕上时,它会及时地释放内存和空间占用。
- 自定义居中焦点
- 圆角图
- 下载失败后,点击重新下载
- 自定义占位图
- 自定义overlay
- 自定义进度条
- 指定用户按压时的overlay


Fresco的Image Pipeline允许你用很多种方式来自定义图片加载过程,比如:

  • 可以先显示一个低清晰度的图片,等下载完之后再显示高清图
  • 加载完成后回调通知
  • 本地图,如果有EXIF缩略图,则先显示缩略图,图片加载完成后再显示大图
  • 支持缩放和旋转图片
  • 可以对已下载的图片再次处理
  • 支持WebP解码,即使在对WebPage支持不完善的Android系统上也能使用。

JPEG格式的渐进式呈现
Android 本身的图片库不支持此格式,但是Fresco支持。使用时,和往常一样,仅仅需要提供一个图片的URI即可,剩下的事情,Fresco会处理。


动图加载
加载Gif图和WebP动图在任何一个Android开发者眼里看来都是一件非常头疼的事情。每一帧都是一张很大的Bitmap,每一个动画都有很多帧。Fresco让你没有这些烦恼,它处理好每一帧并管理好你的内存。


如何使用

导入库

dependencies { 
compile 'com.squareup.picasso:picasso:2.5.2'
}  

初始化
在Application级别初始化Fresco

public class TestApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        Fresco.initialize(this);
    }
}

Layout中添加命名空间

xmlns:fresco="http://schemas.android.com/apk/res-auto"

不添加命名空间则可以

Uri uri = Uri.parse(uri);
imageView.setImageURI(uri);

常用属性

<com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/image_view"
        android:layout_width="300dp"
        android:layout_height="300dp"
        fresco:fadeDuration="300"
        fresco:actualImageScaleType="focusCrop"
        fresco:placeholderImage="@color/wait_color" // 未加载成功
        fresco:placeholderImageScaleType="fitCenter"
        fresco:failureImage="@drawable/error" // 失败显示的图片
        fresco:failureImageScaleType="centerInside"
        fresco:retryImage="@drawable/retrying" // 重试,可重复四次,而后是failureImage
        fresco:retryImageScaleType="centerCrop" // 缩放
        fresco:progressBarImage="@drawable/progress_bar" // 进度条图片
        fresco:progressBarImageScaleType="centerInside"
        fresco:progressBarAutoRotateInterval="1000"
        fresco:backgroundImage="@color/blue" // 首先被绘制的背景图
        fresco:overlayImage="@drawable/watermark" // 叠加图,xml中只能设置一张。代码可设置
        fresco:pressedStateOverlayImage="@color/red" // 点击状态叠加图
        fresco:roundAsCircle="false"
        fresco:roundedCornerRadius="1dp"
        fresco:roundTopLeft="true"
        fresco:roundTopRight="false"
        fresco:roundBottomLeft="false"
        fresco:roundBottomRight="true"
        fresco:roundWithOverlayColor="@color/corner_color"
        fresco:roundingBorderWidth="2dp"
        fresco:roundingBorderColor="@color/border_color"
        />

开始加载图片

Uri uri = Uri.parse("https://raw.githubusercontent.com/facebook/fresco/gh-pages/static/logo.png");
SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);
draweeView.setImageURI(uri);

动态更改

setController(controller)方法加载图片

DraweeController controller = Fresco
                .newDraweeControllerBuilder()
                .setUri(uri).build();
        imageView.setController(controller);

监听加载过程ControllerListener

                ControllerListener listener = new ControllerListener() {

            /**
             * Called before the image request is submitted.
             * <p> IMPORTANT: It is not safe to reuse the controller from within this callback!
             *
             * @param id            controller id
             * @param callerContext caller context
             */
            @Override
            public void onSubmit(String id, Object callerContext) {
                // 在图片加载之前调用
            }

            /**
             * Called after the final image has been set.
             *
             * @param id         controller id
             * @param imageInfo  image info
             * @param animatable
             */
            @Override
            public void onFinalImageSet(String id, Object imageInfo, Animatable animatable) {
                // 加载成功之后
            }

            /**
             * Called after any intermediate image has been set.
             *
             * @param id        controller id
             * @param imageInfo image info
             */
            @Override
            public void onIntermediateImageSet(String id, Object imageInfo) {
                // 渐进式加载完成后
            }

            /**
             * Called after the fetch of the intermediate image failed.
             *
             * @param id        controller id
             * @param throwable failure cause
             */
            @Override
            public void onIntermediateImageFailed(String id, Throwable throwable) {
                // 渐进加载失败
            }

            /**
             * Called after the fetch of the final image failed.
             *
             * @param id        controller id
             * @param throwable failure cause
             */
            @Override
            public void onFailure(String id, Throwable throwable) {
                // 加载失败
            }

            /**
             * Called after the controller released the fetched image.
             * <p> IMPORTANT: It is not safe to reuse the controller from within this callback!
             *
             * @param id controller id
             */
            @Override
            public void onRelease(String id) {
                // 释放资源后的操作
            }
        };

还有一个更简化的接口调用,为单例模式,默认的ControllerListener

ControllerListener controllerListener = BaseControllerListener.getNoOpListener();

如何使用ControllerListener

DraweeController controller = Fresco.newDraweeControllerBuilder()
                .setUri(uri)
                .setControllerListener(listener)
                .build();
        imageView.setController(controller);

动态生成,重复利用GenericDraweeHierarchy动态设置

GenericDraweeHierarchy hierarchy = new GenericDraweeHierarchyBuilder(getResources())
                .setFadeDuration(300)
                .setBackground(getDrawable(R.drawable.ic_launcher))
                .setPlaceholderImage(getDrawable(R.drawable.ic_launcher))
                .setFailureImage(getDrawable(R.drawable.ic_launcher))
                .build();
        imageView.setHierarchy(hierarchy);

复用GenericDraweeHierarchy

GenericDraweeHierarchy hierarchy1 = imageView.getHierarchy();

JPEG渐进式网络加载
渐进式加载是由模糊到清晰的渐进过程,在网络条件不好的时候,渐进式加载能提高用户体验。
渐进式加载也是可以控制的,下面是接口

public interface ProgressiveJpegConfig {

  /**
   * Gets the next scan-number that should be decoded after the given scan-number.
   */
  int getNextScanNumberToDecode(int scanNumber);

  /**
   * Gets the quality information for the given scan-number.
   */
  QualityInfo getQualityInfo(int scanNumber);
}

Fresco提供了简单的控制方式的范例

ProgressiveJpegConfig progressiveJpegConfig = new SimpleProgressiveJpegConfig(list, 2);

Fresco是非常全面而且强大的图片加载框架,可以通过阅读源代码进一步了解他的设计以及使用。


Fresco中文介绍
Github地址

史上最全的Android第三方库解析面试知识点集锦 前言 很多人面试之前,可能没有在互联网公司工作过或者说工作过但年头较短,不知道互联网公司技术面试都会问哪些问题? 再加上可能自己准备也不充分,去面试没几个回合就被面试官几个问题打蒙了,最后以惨败收场。 下述是我整理的Android面试题汇总,由于篇幅原因,在这只把第三方库解析部分的题目列举出来,后续还会更新其余面试题内容,大家可以关注一下我,及时知晓我更新的知识点,同时这份面试集锦的整理也花费了我... 阅读详情

相关推荐

Android图片缓存框架Fresco极其强大的配置

NULL 博文链接:https://zhelong111.iteye.com/blog/2228870

Fresco-图片加载之线程切换与多路复用

Fresco-图片加载之线程切换与多路复用 接上节,看一下我们没有看的两个Producer: ThreadHandoffProducer 与 BitmapMemoryCacheKeyMultiplexProducer /** Bitmap cache get -&gt; thread hand off -&gt; multiplex -&gt; bitmap cache @param input...

软件开发积累 953

详解Android之图片加载框架Fresco基本使用(一)

PS:Fresco这个框架出的有一阵子了,也是现在非常火的一款图片加载框架.听说内部实现的挺牛逼的,虽然自己还没研究原理.不过先学了一下基本的功能,感受了一下这个框架的强大之处.本篇只说一下在xml中设置属性的相关用法. 0.引入Fresco以及相关注意事项。 1.PlaceHolderImage占位图 2.FailureImage加载失败时显示的图片 3.RetryImage重新加载的图片 4.ProgressBarImage加载时显示的进度图片 5.BackgroundImage背景图 6.OverlayImage叠加图 7.多种效果结合加载图片 8.圆形头像,圆角头像以及背景叠加 9.图

Android 图片加载框架之Fresco

一、简介 Fresco是Facebook推出的一款用于Android应用中展示图片的强大图片库,可以从网络、本地存储和本地资源中加载图片。相对于ImageLoader,拥有更快的图片下载速度以及可以加载和显示gif图等诸多优势,是个很好的图片框架。 二、特点 1)内存管理 在5.0以下系统,Fresco将图片...

weixin_39492854的博客 682

HDMI设计6--Video PHY Controller IP

Reference:https://china.xilinx.com/content/dam/xilinx/support/documentation/ip_documentation/vid_phy_controller/v2_2/pg230-vid-phy-controller.pdf 1. 序 Video PHY Controller IP是为实现与视频(DisplayPort和HDMI™技术)MAC传输或接收子系统的即插即用连接而设计的。视频MAC层和PHY层的接口是标准化的,能...

Archar_Saber的博客 8338

VisualStudio2022启动报错

把Users\...\AppData\Local\Microsoft\VisualStudio\11.0\ComponentModelCache中的Microsoft.VisualStudio.Default.cache这个文件移除,再重启vs,各项功能都能正常使用了。第一次使用方法1有效果,不知道什么原因后面又报错再删除缓存文件无效了,最后使用方法2启动VS成功。vs2022启动时,报错弹框,在ActivityLog查看具体报错信息,报错原因未知。网上搜索到两种解决方法。方法1:删除缓存文件。

面朝大海,春暖花开 3936

Android-Binder机制及AIDL使用,已拿offer

感觉现在好多人都在说什么安卓快凉了,工作越来越难找了。又是说什么程序员中年危机啥的,为啥我这年近30的老农根本没有这种感觉,反倒觉得那些贩卖焦虑的都是瞎j8扯谈。当然,职业危机意识确实是要有的,但根本没到那种草木皆兵的地步好吗?Android凉了都是弱者的借口和说辞。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。

2401_84132685的博客 1182

手把手教你为智能手表DIY一个离线导航:LVGL + SD卡地图实战

本文详细介绍了如何为智能手表DIY一个离线导航系统,结合LVGL图形库和SD卡地图数据。从硬件选型、地图数据处理到LVGL地图引擎实现,提供了完整的实战指南,特别适合户外运动爱好者和嵌入式开发者。文章还分享了功耗优化、性能提升等实用技巧,帮助读者打造高效的离线导航解决方案。

weixin_42570484的博客 205

Android实现为View添加阴影效果(附带源码)

Android实现为View添加阴影效果(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1910

R语言灰色关联分析法

输入数据并用DT包的datatable函数展示数据 ABDDEF分别对应第1到第6个供应商产品质量、技术水平、供应能力、经济效益、交货情况、市场影响度指标属于效益型指 产品价格、地理位置、售后服务指标属于成本型指标。现分别对上述指标进行规范化: 对于效益型指标(正项指标)标准化公式为: x∗=x−min(x)max(x)−min(x) x^{\ast}=\frac{x-min\left( x \right)}{max\left( x \right) -min\left( x \right)} x∗=max

qq_54423921的博客 7995

ansys 求解过程中出现未知错误。检查“求解信息”对象上的“求解器输出”,查找可能的原因。-静力学分析遇到的,这是什么原因——An unknown error occurred ——未找到解决方法

点击“确定”关闭弹窗后,进入Workbench的‌“求解信息”对象‌,查看‌“求解器输出”‌,搜索“Error”“Fatal”“Warning”等关键词,找到具体的错误描述,比如材料未定义、网格质量问题、内存不足等,这是精准解决问题的关键。进入“工具-选项-mechanical APDL”,取消勾选“分布式”,GPU加速器选择“none”。在“求解进程设置-高级”中调整内存分配参数,或切换为迭代求解器(如PCG求解器),它更省内存。尝试简化模型,比如删除非关键细节、合并重复部件,分步验证模型,定位问题源。

qq_15963745的博客 602

Android图片加载之Fresco浅析

Android图片加载神器之Fresco

TianciZhu的博客 1078

2、集中式MIMO雷达研究进展:正交波形设计与信号处理

集中式多输入多输出(Multiple Input Multiple Output,MIMO)雷达通常利用正交波形增加发射波形 自由度,采用数字阵列拓展空间收发自由度,使得雷达接收机的天线孔径获得明显扩展,最终带来空间分辨率、 测角精确度、杂波抑制能力等大幅度提升。但是,这些性能提升的前提是发射波形具有正交特性。事实上,在 实际应用中,在不牺牲时域/频域资源情况下,受限于时宽带宽积,无法获得完全正交的波形集合,从而限制了 MIMO雷达系统性能。本文对集中式MIMO雷达正交波形复用的技术原理进行了系统回顾,分别

qq_43416206的博客 2772

Android三大图片加载框架终极对比:Glide、Fresco、Universal Image Loader实现原理深度解析

在Android开发中,图片加载是核心功能之一。选择合适的图片加载框架不仅能提升应用性能,还能显著改善用户体验。目前主流的三大图片加载框架——Glide、Fresco和Universal Image Loader(UIL)各有千秋。本文将从架构设计、缓存机制、功能特性等维度进行深度对比,助你快速掌握它们的实现原理与适用场景。 ## 🚀 框架概述:谁更适合你的项目? ### Glide:专注

gitblog_01425的博客 604

linux v3h平台开发系列详解(GMSL摄像头篇):1.11 解串器MIPI 1.5G高速率特殊deskew配置

解串器max96712 deskew配置

xian18809311584的博客 1775

PCL CSF布料模拟算法【2026最新版】

CSF布料模拟地面滤波算法的PCL实现,博客长期更新,本文最近更新时间为:2026年10月26日。

点云侠的博客 3916

【源码深度】Android 图片加载框架全解析|Glide、Picasso、Fresco、Coil 原理与优化|Android全栈体系150讲-18

u013365435的博客 34

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Fresco图片加载框架Demo,简单展示静态图片,gif动图

效果图 --------- ---------------------------------------------------------------------------- 加号表示最新权限 ----------------------------------------------------------------------

天纵神武的博客 462

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

强大Android图片加载的框架:Fresco

 Fresco是facebook推出的一款强大的图片加载的框架,这个框架出来一段时间了,前一段时间使用过了ImageLoader的框架,生命在于折腾,今天就来折腾一下Fresco这个强大的框架。 Fresco是facebook推出的一款强大的图片加载的框架,这个框架出来一段时间了,前一段时间使用过了ImageLoader的框架,生命在于折腾,今天就来折腾一下Fresco这个强

wblobin的博客 685

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android入门到实战(六):Android主流图片加载框架

本文介绍了Android开发中常用的图片加载框架及其适用场景。主流框架包括功能全面的Glide、轻量级的Picasso、适合大图的Fresco和Kotlin原生的Coil,开发者可根据项目需求选择。文章重点讲解了最常用的Glide框架,提供了一份实用速查表,涵盖网络图片加载、占位图设置、GIF播放、本地资源加载、图片裁剪、缓存管理等常见场景,并给出了具体代码示例。最后指出Glide适合传统XML项目,Coil适合Jetpack Compose,Fresco擅长处理大图,而Picasso则适用于简单场景。

weixin_39339407的博客 1503

fresco框架初始化、加载、缓存分析(常规的缓存设置策略)

fresco框架初始化、加载、缓存分析

罗密欧与猪过夜的博客 3110

ANDROID 最近比较常用的框架

站在巨人的肩膀上,好好学习。 fresco:facebook推出的图片加载库,相比Glide,Picasso,Universal Image Loaader,Volley在加载图片时消耗的内存比较低,不错的图片加载框架。jackson:它和其他几个json解析框架相比请参考这里,性能对比很明显。awesome-android-ui:对于Material design 这是个不错的学习资料,包含很多框

hgb's coding Blog 417

Android GitHub 常用开源框架汇总

现在 GitHub 上流行的开源库极大地节省了开发者从 0 开发的时间,很多公司和个人都在 GitHub 上开源自己的项目,今天我们就来整理一下 Android 开发中一些非常流行的库,也是我们必须掌握的,这样可以使我们在使用到时快速的查找到,这里的总结基本也都是自己在开发中用到的,也就是一些个人的见解,只做参考,不具有权威性。 一、网络库 1. Retrofit Retrofit 是 Squar...

LoveDou0816的博客 594

Android平台主流开源框架的源码与原理分析(Okhttp/Glide/Gson等)

第三方框架(原理)分析。 Android平台主流开源框架的源码与原理实现- https://github.com/sucese/android-open-framework-analysis --常用的框架分为下面几类: 1.UI框架和自定义控件; 2.网络请求框架; 3.图片缓存框架; 4.数据存储框架; 5.事件总线框架; 6.插件化和热部署; 分析具体耗时的Trace view;布...

ShareUs的专栏 1519

Android 开发进阶系列博文介绍

Android 开发进阶 系列博客,打算从目前主流的一些框架来详细分析,这些框架有网络方面的,例如OkHttp,数据库方面的,例如GreenDAO,图片加载方面的,例如Fresco,等等,本系列博客主要讲解这些框架简单使用,项目实战,如果还有时间,那么会对这些框架进行更深入的学习与解析。如果博客中要错误,欢迎指出!

程序员七哥 859
上一篇: App研发录第二章
下一篇: 读书笔记App研发录--数据缓存设计
PirateBrook
博客等级 码龄11年 90粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值