Android的图片加载框架

Android的图片加载框架

  • 为什么要使用图片加载框架?
  • 图片加载框架
    • 1. Universal Image Loader [https://github.com/nostra13/Android-Universal-Image-Loader](https://github.com/nostra13/Android-Universal-Image-Loader)
    • 2. Glide [https://muyangmin.github.io/glide-docs-cn/](https://muyangmin.github.io/glide-docs-cn/)
    • 3. Picasso [https://square.github.io/picasso/Picasso](https://square.github.io/picasso/Picasso)
    • 4. Fresco [https://www.fresco-cn.org/](https://www.fresco-cn.org/)
    • NovaImageLoader
  • 图片加载框架的缓存机制
  • 如果要你自己实现一套图片加载框架该如何实现?
  • 给一个url,如何把图片渲染到ImgeView上去?具体流程?
  • 基本用法
  • 高阶功能对比(fresco vs NovaImageLoader)
  • 注意点
    • 图片加载需要注意使用控件尺寸

为什么要使用图片加载框架?

在这里插入图片描述
在Android开发中,有许多图像加载框架可供选择。
图片加载框架是有一个总体套路的,我们自己也可以通过这个流程实现一个图片框架。
图片加载:封装、解析、下载、解码、变换、缓存、显示等。
大型工程
需考虑图片种类、图片使用率、加载性能、缓存机制、高效、简便的完成图片渲染任务。
图片资源类型:jpeg、jpg、png、Webp、AWebp、Lottie、SVGA、NinePatch(点9)、AVD、File(透明视频)
存放位置选择:当资源大小超过10Kb时,存放在NOS上;资源较小时,可以根据资源类型选择存放在drawable或assets目录下。
那么其他图片加载框架凭什么就能比我自己写的好?

图片加载框架

1. Universal Image Loader https://github.com/nostra13/Android-Universal-Image-Loader

是最早出现的一个知名图片加载显示框架,虽然现在已经停止维护了,但是仍然被很多的开发者所使用。并且,后续出现的Glide,Picasso和Fresco也都或多或少借鉴了它的设计思想和理念。
在这里插入图片描述

2. Glide https://muyangmin.github.io/glide-docs-cn/

Glide是在2013年由Google推出的,它是当时最的图片加载库之一。Glide的速度比Picasso更快,Glide的长处是处理大型的图片流,如gif、video。如果要制作视频类应用,Glide当为首选。
在这里插入图片描述

3. Picasso https://square.github.io/picasso/Picasso

是在2015年由Square公司推出的,它比Glide体积小很多且图像质量更高
在这里插入图片描述

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

Fresco是在2016年由Facebook推出的,可以说是综合了之前图片加载库的优点,其在5.0以下的内存优化方面表现不错。但是,Fresco在处理大型图片流时速度较慢
在这里插入图片描述
Image Pipeline
在这里插入图片描述

NovaImageLoader

基于已有图片加载框架的优点,云音乐自己封装好的图片加载框架。

图片加载框架的缓存机制

当用户应用打算从网络上请求一张图片时,程序会首先从内存中去获取,如果内存中没有那就从存储设备中去获取,如果存储设备中没有,那就从网络中下载这张图片。因为从内存中加载图片比从存储设备中加载图片要快,所以这样既提高了程序的效率又为用户节约了不必要的流量开销。

Fresco的缓存机制是由Producer/Consumer的框架来实现的。图片获取是由各级Producer实现的,而将获取到的图片添加到缓存中是由各级Cusumer来实现的。

Fresco有三级缓存:L1、L2和L3。其中,L1缓存是最快的,但是容量最小;L2缓存容量最大,但是速度最慢;L3缓存速度介于L1和L2之间,但是容量最小。

除了Fresco,其他图片加载框架也有缓存机制。Picasso的缓存机制包括内存缓存磁盘缓存,而Glide的缓存机制包括内存缓存磁盘缓存网络缓存HTTP缓存

如果要你自己实现一套图片加载框架该如何实现?

资源封装(加密、序列化,方便数据存储) -> 活动缓存(暂存当前正在使用的图片资源) -> 内存缓存(LRU最近最少使用策略) -> 磁盘缓存(LRU最近最少使用策略)

给一个url,如何把图片渲染到ImgeView上去?具体流程?

第一步: 在UI线程定义 网络图片链接;
第二步: 新建子线程请求图片,请求结果为bitmap,解码数据流;
第三步: 在UI线程将图片加载出来;

基本用法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

高阶功能对比(fresco vs NovaImageLoader)

温馨提示:以下NovaImageLoader是个人自定义组件笔记,其他小伙伴看到NovaImageLoader就可以跳过啦
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意点

图片加载需要注意使用控件尺寸

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/295571.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美摄科技AI智能图像矫正解决方案

图像已经成为了企业传播信息、展示产品的重要媒介,在日常拍摄过程中,由于摄影技巧的限制和拍摄环境的复杂多变,许多企业面临着图像内容倾斜、构图效果不佳等挑战,这无疑给企业的形象展示和信息传递带来了不小的困扰。 美摄科技深…

CentOS7安装flink1.17完全分布式

前提条件 准备三台CenOS7机器,主机名称,例如:node2,node3,node4 三台机器安装好jdk8,通常情况下,flink需要结合hadoop处理大数据问题,建议先安装hadoop,可参考 hadoop安…

顶顶通呼叫中心中间件-话术编辑器机器人转人工坐席配置(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-话术编辑器机器人转人工座席配置(mod_cti基于FreeSWITCH) 配置方法 一、ACD排队转接 二、伴随转接 比如你设置的通知规则是任意满足一个就通知那么通话时间设置为10 秒那样他只要通话时间到10秒他就会转坐席。 如果要转人工的时侯转手机可以这样配置 把…

用于HUD平视显示器的控制芯片:S2D13V40

一款利用汽车抬头显示技术用于HUD平视显示器的控制芯片:S2D13V40。HUD的全称是Head Up Display,即平视显示器,以前应用于军用飞机上,旨在降低飞行员需要低头查看仪表的频率。起初,HUD通过光学原理,将驾驶相关的信息投射…

53 v-bind 和 v-model 的实现和区别

前言 这个主要的来源是 偶尔的情况下 出现的问题 就比如是 el-select 中选择组件之后, 视图不回显, 然后 model 不更新等等 这个 其实就是 vue 中 视图 -> 模型 的数据同步, 我们通常意义上的处理一般是通过 模型 -> 数据 的数据同步, 比如 我们代码里面更新了 model.…

pygame--坦克大战(二)

加载敌方坦克 敌方坦克的方向是随机的,使用随机数生成。 初始化敌方坦克。 class EnemyTank(Tank):def __init__(self,left,top,speed):self.images {U: pygame.image.load(img/enemy1U.gif),D: pygame.image.load(img/enemy1D.gif),L: pygame.image.load(img/e…

10_MVC

文章目录 JSON常用的JSON解析Jackson的常规使用指定日期格式 MVC设计模式MVC介绍前后端分离案例(开发与Json相关接口) 三层架构三层架构介绍 JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,是存…

python 爱心代码

效果图: 代码: import random from math import sin, cos, pi, log from tkinter import *CANVAS_WIDTH 640 CANVAS_HEIGHT 480 CANVAS_CENTER_X CANVAS_WIDTH / 2 CANVAS_CENTER_Y CANVAS_HEIGHT / 2 IMAGE_ENLARGE 11 # 设置颜色 HEART_COLOR &…

QT中的文件操作QFile、QDataStream、QTextStream、QBuffer

文件操作概述 1、Qt中IO操作的处理方式 (1)、Qt通过统一的接口简化了文件与外部设备的操作方式 (2)、Qt中的文件被看做是一种特殊的外部设备 (3)、Qt中的文件操作与外部设备操作相同 2、IO操作中的关键…

Topaz Video AI for Mac v5.0.0激活版 视频画质增强软件

Topaz Video AI for Mac是一款功能强大的视频处理软件,专为Mac用户设计,旨在通过人工智能技术为视频编辑和增强提供卓越的功能。这款软件利用先进的算法和深度学习技术,能够自动识别和分析视频中的各个元素,并进行智能修复和增强&…

DAY17 平衡二叉树二叉树所有路径左叶子之和

12.平衡二叉树 给定一个二叉树,判断它是否是 平衡二叉树? 平衡二叉树是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子…

ZKP价值链路的垂直整合

1. ZKP proof生命周期 从ZKP(zero-knowledge proof)生命周期,先看围绕ZKP的价值链路形成: 1)User intent用户意图:以某用户意图为起点,如想要在某zk-rollup上swap某token、证明其身份、执行某…

EasyExcel 模板导出excel、合并单元格及单元格样式设置。 Freemarker导出word 合并单元格

xls文件: 后端代码: InputStream filePath this.getClass().getClassLoader().getResourceAsStream(templateFile);// 根据模板文件生成目标文件ExcelWriter excelWriter EasyExcel.write(orgInfo.getFilename()).excelType(ExcelTypeEnum.XLS).withTe…

element-ui badge 组件源码分享

今日简单分享 badge 组件的源码实现,主要从以下两个方面: 1、badge 组件页面结构 2、badge 组件属性 一、badge 组件页面结构 二、badge 组件属性 补充几个标签的用途: sub:下标、sup:上标、var 变量 代码如下&am…

docker搭建CI/CD环境配置过程中的常见问题

一、Jenkins 1、pull镜像问题 docker pull jenkins/jenkins:lts Using default tag: latest Trying to pull repository docker.io/library/centos ... Get https://registry-1.docker.io/v2/library/centos/manifests/latest: Get https://auth.docker.io/token?scoperepo…

端点攻击剖析:网络攻击如何破坏企业网络

为了实现真正有效的网络安全态势,将公司的所有设备作为网络设备进行保护至关重要。攻击者可以将任何端点(电话、计算机、虚拟机、嵌入式设备、服务器、POS 终端)变成进入组织的入口点。 未受保护的端点是恶意行为者的主要攻击媒介&#xff0…

Git 核心知识

2024年4月2日更新 Git 安装 官网下载,Git 选择合适的版本,无脑下一步即可。 安装成功之后,鼠标右键任意的文件夹,会出现 Git GUI 的选项,即安装成功 安装注意事项 安装前,检查环境变量 , 如…

15.Python访问数据库

如果数据量较少,则我们可以将数据保存到文件中;如果数据量较 大,则我们可以将数据保存到数据库中。 1 SQLite数据库 SQLite是嵌入式系统使用的关系数据库,目前的主流版本是SQLite 3。SQLite是开源的,采用C语言编写而…

Springboot整合Milvus向量库

1. Milvus的Maven依赖&#xff0c; 配置如下 <dependency><groupId>io.milvus</groupId><artifactId>milvus-sdk-java</artifactId><version>2.3.4</version><exclusions><exclusion><artifactId>log4j-slf4j-imp…

组合总和-java

题目描述: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被…