热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

androiddrawable转bitmap_Android图片加载框架Fresco的使用

Fresco这个框架和Glide,Picasso一样都比较流行,在性能上和使用上都比较完善,所以本篇将分享一下此框架的点点滴滴࿰

Fresco这个框架和Glide,Picasso一样都比较流行,在性能上和使用上都比较完善,所以本篇将分享一下此框架的点点滴滴,希望大家喜欢。

Fresco是Facebook提供的开源图片加载库,它能够从网络,本地存储和Android资源文件中加载图片,且具有三级缓存设计(2级内存,1级文件),我们并不需要再去关心图片的加载和显示这些繁琐的事情,这是他的官网所描述的:

https://www.fresco-cn.org/

要想使用它我们可以可以循序渐进,先看下他的Github:

https://github.com/facebook/fresco

你想使用它的话,可以在 app/build.gradle 中添加如下依赖:

implementation 'com.facebook.fresco:fresco:1.13.0'

当然,这是最基础的,如果你还想额外支持Gif或者WebP的话是需要配置如下:

// 支持 GIF 动图,需要添加

implementation 'com.facebook.fresco:animated-gif:1.13.0'

// 支持 WebP (静态图+动图),需要添加

implementation 'com.facebook.fresco:animated-webp:1.13.0'

implementation 'com.facebook.fresco:webpsupport:1.13.0'

// 仅支持 WebP 静态图,需要添加

implementation 'com.facebook.fresco:webpsupport:1.13.0'

一.加载图片

我们如果想使用Fresco的话,首先就是初始化了,在我们的Application中的onCreate里初始化:Fresco.initialize(this);

然后添加一下网络权限,就可以在xml中使用SimpleDraweeView类来加载

加载图片的方式很简单:

mSimpleDraweeView = (SimpleDraweeView) findViewById(R.id.mSimpleDraweeView);

mSimpleDraweeView.setImageURI(Uri.parse(IMG_URL));

可以看到,只需要setImageURI即可完成显示效果,如图:

94fb4c3ef8d917360eace4f7a5bb8a06.png

这里要注意的是,SimpleDraweeView的高宽不能设置为wrap_content,因为Fresco加载的图片,下载的图片,缓存的图片可能尺寸并不相同,所以View可能会重新测量,导致无法显示的问题,如下代码:

6482ebf686f7746502eb2e2dd349dc92.png

这只是最基本的加载方式,剩下的工作Fresco会帮你完成:

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

二.Fresco概念

我们只需要设置一下Url就可以完成显示工作,那么,这其中都是由谁来完成什么工作的呢?这个概念大家可以了解一下。

DraweeView

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

一般情况下,使用 SimpleDraweeView 即可。 你可以在 XML 或者在 Java 代码中使用它,通过 setImageUri给它设置一个 URI 来使用

DraweeHierarchy

DraweeHierarchy 用于组织和维护最终绘制和呈现的Drawable对象

DraweeController

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

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

DraweeControllerBuilder

DraweeControllers 由 DraweeControllerBuilder 采用 Builder 模式创建,创建之后,不可修改

Listeners

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

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

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

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

Fresco支持的Uri格式很多,基本上大部分的都是支持的,可以查阅此链接查看:

https://www.fresco-cn.org/docs/supported-uris.html

三.在XML中使用Drawees

图片加载的可定制性非常的高,我们来看下官方的示例:

//淡入淡出的动画持续时间

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"

//重试图的缩放类型

fresco:retryImageScaleType="centerCrop"

//进度图

fresco:progressBarImage="@drawable/progress_bar"

//进度图的缩放类型

fresco:progressBarImageScaleType="centerInside"

//进度图自动选择的间隔时间

fresco:progressBarAutoRotateInterval="1000"

//背景图

fresco:backgroundImage="@color/blue"

//叠加图

fresco:overlayImage="@drawable/watermark"

//按压状态下显示的叠加图

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"

//宽高比

fresco:viewAspectRatio = "1.33f"

四.在Java中使用Drawees

在xml中只需要配置一下即可,如果在代码中,那么我们如何使用?实际上使用到的还是我们之前在概念中提到的DraweeControllerBuilder,来看下如下代码:

c65cd841213951e1e65375734b970587.png

在这段代码中我通过new一个GenericDraweeHierarchyBuilder后setRoundingParams方法,来调用参数类,最终设置给SimpleDraweeView,就得到了一个圆角的图片:

e8ef9546515f52744e3412221996039b.png

当然,不止这一种用法, 在xml中所用到的属性都是可以在java中实现的,这里就不一一赘述了,有兴趣的可以自己去看看使用方式。

如果想使用进度条来显示加载进度,可以通过

builder.setProgressBarImage(new ProgressBarDrawable());

的方式添加,当然,一般我们会自己去定义进度的加载

五.Gif的支持

Gif的支持需要增加依赖:

// 支持 GIF 动图,需要添加

implementation 'com.facebook.fresco:animated-gif:1.13.0'

代码比较简单

462f2088d015470b5ceb640e09802c91.png

加载Gif并且设置为自动播放即可。

8c987cfceaeb40150a5638f40826779c.png

Fresco很强大,可定义包括支持的东西很多,这里就不一一介绍,你使用的话直接按照流程来即可, 相关功能可查阅:

https://www.fresco-cn.org/docs/using-drawees-xml.html

至此,我们本篇到这里就结束了。

有兴趣可以加入我的星球:Hi Android , 里面可都是我手撸的新鲜文章,高质量你值得拥有!

进入星球你可以做什么?

1.我的所有视频可以观看

2.发布提问贴可以得到满意的答案

3.可指定我写你感兴趣的技术文章

4.初学者可配套视频辅导

5.有机会线下交流聚会

也可以加入交流群:417046685



推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • Asp.net Mvc Framework 七 (Filter及其执行顺序) 的应用示例
    本文介绍了在Asp.net Mvc中应用Filter功能进行登录判断、用户权限控制、输出缓存、防盗链、防蜘蛛、本地化设置等操作的示例,并解释了Filter的执行顺序。通过示例代码,详细说明了如何使用Filter来实现这些功能。 ... [详细]
  • 本文介绍了ASP.NET Core MVC的入门及基础使用教程,根据微软的文档学习,建议阅读英文文档以便更好理解,微软的工具化使用方便且开发速度快。通过vs2017新建项目,可以创建一个基础的ASP.NET网站,也可以实现动态网站开发。ASP.NET MVC框架及其工具简化了开发过程,包括建立业务的数据模型和控制器等步骤。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文总结了在开发中使用gulp时的一些技巧,包括如何使用gulp.dest自动创建目录、如何使用gulp.src复制具名路径的文件以及保留文件夹路径的方法等。同时介绍了使用base选项和通配符来保留文件夹路径的技巧,并提到了解决带文件夹的复制问题的方法,即使用gulp-flatten插件。 ... [详细]
author-avatar
bluelucky2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有