【Android】Glide的简单使用(上)

news2024/11/24 22:45:29

文章目录

    • 引入
      • Glide的优点:
      • 缺点:
    • 使用
      • 常用方法:
        • 从网络加载图片
        • 从文件加载图片
        • 加载`resource`资源
        • 加载`URI`地址
        • 设置占位图
        • 出错时的图片
        • 占位图
        • 图片过渡的`Transitions`
        • 自定义过渡动画
        • 图片大小调整
        • 缩放图片
        • 播放`gif`
        • `asGif()`
        • 把`Gif`当作`Bitmap`播放
        • 显示本地视频缩略图

引入

GlideGoogle员工的开源项目,Google官方App中已经使用,在2015年的Google I/O上被推荐。

Glide的优点:

  • 使用简单
  • 可配置度高,自适应程度高
  • 支持多种数据源,网络、本地、资源、Assets
  • 支持Gif图片。
  • 支持WebP
  • 加载速度快、流畅度高。
  • Glidewith()方法不光接受Context,还接受ActivityFragment,这样图片加载会和Activity/Fragment的生命周期保持一致,比如Pause状态在暂停加载,在Resume的时候又自动重新加载。
  • 支持设置图片加载优先级
  • 支持缩略图,可以在同一时间加载多张图片到同一个ImageView中,例如可以首先加载只有ImageView十分之一大小的缩略图,然后等再加载完整大小的图片后会再显示到该ImageView上。
  • 内存占用低,Glide默认的Bitmap格式是RGB_565,比ARGB_8888格式的内存开销要小一半,所以图片质量会稍微差一些,当然这些配置都是可以修改的。
  • Glide缓存的图片大小是根据ImageView尺寸来缓存的的。这种方式优点是加载显示非常快。且可以设置缓存图片的尺寸
  • 默认使用HttpUrlConnection下载图片,可以配置为OkHttp或者Volley下载,也可以自定义下载方式。
  • 默认使用两个线程池来分别执行读取缓存和下载任务,且可以自定义。
  • 默认使用手机内置存储进行磁盘缓存,可以配置为外部存储,可以配置缓存大小,图片池大小。
  • 在加载同样配置的图片时,Glide内存占用更少,因为Glide是针对每个ImageView适配图片大小后再存储到磁盘的,这样加载进内存的是压缩过的图片,内存占用自然就比较少。这种做法有助于减少OutOfMemoryError的出现。
  • 高效处理Bitmap,使用Bitmap Pool来对Bitmap进行复用,主动调用recycle回收需要回收的Bitmap,减小系统回收压力

缺点:

  • 体积相对来说比较大,目前最新版的大小在500k左右
  • 当我们从远程URL地址下载图片时,Picasso相比Glide要快很多。可能的原因是Picasso下载完图片后直接将整个图片加载进内存,而Glide还需要针对每个ImageView的大小来适配压缩下载到的图片,这个过程需要耗费一定的时间。(当然我们可以使用thumbnail()来减少压缩的时间)

使用

加载图片,需要至少传入三个参数:

  • with(Context context):Context是很多android api所必要的参数,glide也一样。可以传递Activity/Fragment,而且
    它会和Activity/Fragment的生命周期进行绑定
  • load(String imageUrl):图片的URL地址。
  • into(ImageView targetImageView):需要将加载的图片显示到的对应的ImageView
@Override public void onCreate(Bundle savedInstanceState) {
  ...
  ImageView imageView = (ImageView) findViewById(R.id.my_image_view);

  GlideApp.with(this).load("xxxxxx").into(imageView);
}

常用方法:

从网络加载图片
GlideApp.with(context).load(internetUrl).into(targetImageView);
从文件加载图片
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"file.jpg");
GlideApp.with(context).load(file).into(imageViewFile);
加载resource资源
int resourceId = R.mipmap.ic_launcher;
GlideApp.with(context).load(resourceId).into(imageViewResource);
加载URI地址
GlideApp.with(context).load(uri).into(imageViewUri);
设置占位图
GlideApp  
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .placeholder(R.mipmap.placeholder) // 可用drawable
    .into(imageViewPlaceholder);
出错时的图片
GlideApp  
    .with(context)
    .load("xxxxx")
    .placeholder(R.mipmap.ic_launcher) 
    .error(R.mipmap.wrong) // 出错时放置的图片
    .into(imageViewError);
占位图

上面的error()展位图是当资源无法获取时使用的,例如图片地址无效,但是还有另外一种情况是你传递了null值。比如在一个显示用户资料列表中,由于并不是
每个人都有头像图片,所有这时可能会传递null值。如果想要指定一个在传递null值时显示的错误图片可以使用.fallback().

String nullString = null; // could be set to null dynamically

GlideApp  
    .with(context)
    .load(nullString)
    .fallback(R.drawable.wrong2)
    .into(imageView);
图片过渡的Transitions

无论你是否使用占位图,在UI过程中改变ImageView的图片都是一个很大的动作。有一个简单的方法可以使这种改变变的更平滑,更容易让人接受,那就是使用
crossfade动画。

GlideApp  
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .placeholder(R.mipmap.ic_launcher) // can also be a drawable
    .error(R.mipmap.wrong) // will be displayed if the image cannot be loaded
    .transition(DrawableTransitionOptions.withCrossFade())// withCrossFade(int duration)方法可以传入时间,默认时间是300毫秒
    .into(imageViewCombined);
自定义过渡动画

上面提供了crossfade动画,但是有些时候我们需要自定义更多的样式。
Glide也是支持xml中自定义的动画文件的。

GlideApp  
    .with(context)
      .load(eatFoodyImages[0])
      .transition(GenericTransitionOptions.with(R.anim.zoom_in))
      .into(imageView1);
图片大小调整

大多数情况下,实际放置的大小和获取的大小无法完全适配。

Glide优化了在内存上的占用。Glide在缓存和内存里自动限制图片的大小去适配ImageView的尺寸。Picasso也有同样的能力,但需要调用fit()方法。用Glide时,如果图片不需要自动适配ImageView,调用override(horizontalSize, verticalSize),它会在将图片显示在ImageView之前调整图片的大小。

这个设置也有利于没有明确目标,但在已知尺寸的视图上。例如,如果app想要预先缓存在splash屏幕上,还没法测量出摆放的控件具体宽高。但是如果你已经知道图片应当为多大,使用override可以提供一个指定的大小的图片。

GlideApp  
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .override(600, 200) // 将图像大小调整为这些尺寸(以像素为单位)。调整大小不考虑纵横比
    .into(imageViewResize);
缩放图片

对于任何图像的任何处理,调整图像的大小可能会扭曲长宽比,丑化图片的显示。

Glide提供了变换去处理图片显示:

CenterCrop()会缩放图片让图片充满整个ImageView的边框,然后裁掉超出的部分。ImageVIew会被完全填充满,但是图片可能不能完全显示出。
fitCenter()会缩放图片让两边都相等或小于ImageView的所需求的边框。图片会被完整显示,可能不能完全填充整个ImageView

GlideApp  
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[0])
    .override(600, 200)
    .centerCrop() // 这种裁剪技术缩放图像,使其填充请求的边界,然后裁剪多余的边界。
    .into(imageViewResizeCenterCrop);
播放gif

R-C.gif

String gifUrl = "https://s2.loli.net/2023/12/05/lM4cKaQUPmeurT8.gif";

GlideApp  
    .with(context)
    .load(gifUrl)
    .into(imageViewGif);

这里注意:如果提供的源不是Gif,可能是一个普通的图片。即使是一个完好的图片(非Gif),Glide也会加载失败。.error()回调方法会被调用,并加载错误占位图,那么可以进行强迫生成gif。↓

asGif()

这样引入了一个额外的方法.asGif()强迫生成一个Gif

GlideApp  
    .with(context)
    .asGif()
    .load(gifUrl)
    .error(R.drawable.wrong)
    .into(imageViewGif);
Gif当作Bitmap播放

如果需要显示一组网络URL,可能包括普通的图片或者Gif。如果你只是想要显示Gif的第一帧(图片),当URl指向的的确是Gif,你可以调用asBitmap()将其作为常规图片显示。

GlideApp  
    .with(context)
    .asBitmap()
    .load(gifUrl)
    .into(imageViewGif);
显示本地视频缩略图
String filePath = "/storage/emulated/0/Pictures/targetVideo.mp4";

GlideApp  
    .with(context)
    .asBitmap()
    .load(Uri.fromFile(new File(filePath)))
    .into(imageViewGifAsBitmap);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ISNAS-DIP: Image-Specific Neural Architecture Search for Deep Image Prior

ISNAS-DIP:用于深度图像先验的图像特定神经架构搜索 论文链接:https://arxiv.org/abs/2111.15362v2 项目链接:https://github.com/ozgurkara99/ISNAS-DIP Abstract 最近的研究表明,卷积神经网络(CNN)架构在频谱上偏向较低频率&…

装修风格及要求

水电改造 报价? 电线 3C认证国标BV线(非BVR),电线上有厂名,买足百米的 厨卫空调4平方线普通插座2.5平方线冰箱2.5平方线照明2.5平方线入户主线6平方或10平方 地面电线点对点,线和线管连接处要有锁扣 品…

Pandas使用过程中的神器加持 你不用不要怪我

Pandas是我们日常处理表格数据最常用的包,但是对于数据分析来说,Pandas的DataFrame还不够直观,所以今天我们将介绍4个和Pandas相关的Python包,可以将Pandas的DataFrame转换交互式表格,让我们可以直接在上面进行数据分析…

将文件夹中所有文件名取出

dir C:\Users\是啊\Desktop\实验五/b>C:\Users\是啊\Desktop\1111.xls C:\Users\是啊\Desktop\实验五(这个是文件夹路径) /b (参数) C:\Users\是啊\Desktop\1111.xls(文件名输出的文件路径)

电路装修干货上篇|装修小白硬装必做功课。福州中宅装饰,福州装修

你是否曾经遇到过这样的情况:同时开启浴霸和电磁炉时,家里的电闸却跳了。这种情况往往会让人们对家居装修中的电线布置产生疑问。今天,以一位从业装修工作10年的工长的经验,为大家解答有关电线布置的常见问题。 1️⃣电线的平方数…

★581. 最短无序连续子数组

581. 最短无序连续子数组 方法一: class Solution {public int findUnsortedSubarray(int[] nums) {// 数组的复制int[] sortednums new int[nums.length];System.arraycopy(nums, 0, sortednums, 0, nums.length);Arrays.sort(sortednums);int l0,rnums.length-1;…

基于Java SSM框架实现汽车在线销售系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现汽车在线销售系统演示 摘要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识&a…

Leetcode—383.赎金信【简单】

2023每日刷题(五十) Leetcode—383.赎金信 实现代码 class Solution { public:int arr[26] {0};int arr2[26] {0};bool canConstruct(string ransomNote, string magazine) {int len ransomNote.size();int len2 magazine.size();for(int i 0; i …

前置微小信号放大器在传感器测试中的应用

前置微小信号放大器在医疗领域中有广泛的应用。它们是一种专门设计用于放大微弱信号的放大器,可以提升信号的强度和质量,从而帮助医生进行准确的诊断和治疗。以下是前置微小信号放大器在医疗中的几个主要应用。 前置微小信号放大器常用于心电图设备中。E…

开始使用高性能、低延迟的对象存储服务 Amazon S3 Express One Zone

全新的对象存储服务 Amazon S3 Express One Zone 旨在提供比 Amazon S3 Standard 高出10倍的性能,同时每秒可处理数十万个请求,并且延迟始终保持在个位数毫秒级,因此非常适合存储最常访问的数据和要求最苛刻的应用程序。将对象存储和复制到单…

21款奔驰GLC300L升级HUD抬头显示 平视仪表信息

说起HUD抬头显示这个配置,最初是用在战斗机上的,它可以让战斗机驾驶员读取飞机的各种信息和状态,而无需移动头部,这样就能够有效的提高效率。但随着汽车技术的进步HUD这种配置也逐渐下放到民用车上。 发展到今,车上的…

Linux Shell 基础命令

Linux 是一个开源的操作系统,其命令行界面是它的重要组成部分。在这个界面下,Shell 是一个能够与操作系统进行交互的工具。Shell 是一种程序,它能够接收用户输入的命令,并将这些命令发送到操作系统中进行处理。 在 Linux 中&…

UE小:UE5性能分析

开始录制性能追踪 要开始录制性能追踪,您可以简单地点击界面上的“开始录制”按钮。 查看追踪数据 录制完成后,点击“Trace”菜单中的“UnrealInsights”选项来查看追踪数据。 使用命令行进行追踪 如果点击录制按钮没有反应,您可以通过命令…

R语言【rgbif】——最全最详细的函数解读(name_suggest)

name_suggest最全最详细的参数解读 1. name_suggest的基本情况2. name_suggest的参数3. name_suggest的示例与理解3.1 参数 【q】3.2 参数【rank】3.3 参数【limit】3.4 参数【fields】3.5 参数【datasetKey】3.6 参数【curlopts】 1. name_suggest的基本情况 name_suggest是用…

ROS小练习——话题发布

目录 一、话题与消息获取 1、话题 2、消息 二、代码编写 1、C 2、python 三、编译运行 一、话题与消息获取 打开小乌龟案例 1、话题 rqt_graph rostopic list 2、消息 获取消息类型: rostopic type /turtle1/cmd_vel 获取消息格式: rosmsg info geometry_msgs/Twi…

NFC对物联网开发的影响及用途

当谈到NFC对物联网的影响时,不得不提它的几个重要的优势,可能在未来几年影响着物联网的发展方向。 全球智能手机的普及是其中一个重要因素:市面上已有数十亿部支持NFC的智能手机,专家们相信这个数字还会大幅增长。智能手机用户已…

2023年美赛获奖结果分析(附中英文版赛题)

023年美国大学生数学建模竞赛(MCM/ICM)成绩已经公布,现在就请跟随着忠哥一起通过Python 进行大数据分析吧! 美赛成绩分析 2023年美国大学生数学建模竞赛MCM参赛队伍总数为11296支,ICM参赛队伍总数为9562支&#xff0…

PostGIS学习教程九:空间连接

PostGIS学习教程九:空间连接 空间连接(spatial joins)是空间数据库的主要组成部分,它们允许你使用空间关系作为连接键(join key)来连接来自不同数据表的信息。我们认为“标准GIS分析”的大部分内容可以表示…

创建Vue2项目,引入chart.js,并生成柱形图

1. 创建一个新的 Vue 2 项目 如果你还没有创建项目,可以使用 Vue CLI 来创建一个新项目。首先确保你已经安装了 Node.js 和 npm。然后安装 Vue CLI 并创建一个新项目。 npm install -g vue/cli vue create my-vue-chart-project在创建过程中选择 Vue 2 版本。 2.…

物料做出库的时候提交,提示 【即时成本为0】

【财务会计】——【出库核算】——【材料出库核算】