[Android]图片加载库Glide

简介: [Android]图片加载库Glide



Glide的介绍


Glide是一个快速高效的Android图片加载库,可以自动加载网络,本地文件,app资源中的文件,注重于平滑的滚动。

开源地址:https://github.com/bumptech/glide

中文文档:https://muyangmin.github.io/glide-docs-cn/

添加依赖

implementation 'com.github.bumptech.glide:glide:4.11.0'

添加网络权限

<uses-permission android:name="android.permission.INTERNET"/>

Glide的基本使用


加载图片:

val imageview:ImageView=findViewById(R.id.imageview)
        Glide.with(this)
            .load("https://images.pexels.com/photos/10396930/pexels-photo-10396930.jpeg?cs=srgb&dl=pexels-valeriia-miller-10396930.jpg&fm=jpg")
            .into(imageview)

下面我们来看一下这些方法的解析吧

Glide.with()方法用于创建一个加载图片的实例

with()方法可以接收Context,Activity,Fragment类型的参数,这个参数的生命周期将会和加载的图片绑定在一起,如果传递的是activity,那么这个图片是和activity绑定在一起的,activity退出销毁,那么Glide就会把图片加入到它的内存之中管理,也不会去显示这张图片了。

load()方法用于指定待加载的图片资源,包括网络图片,本地图片,应用资源,二进制流,Uri对象等。

into()方法,希望图片显示在哪个ImageView,就把这个ImageView的实例传进去。

 

指定图片的格式


在with()方法的后面加入一个asBitmap()方法,就表示强制指定加载静态图片。

在with()方法的后面加入一个asGif()方法,就表示强制指定加载动态图片。

在with()方法的后面加入一个asFile()方法,就表示强制指定加载文件格式。

在with()方法的后面加入一个asDrawable()方法,就表示强制指定加载Drawable格式。

Glide占位符


Glide4中占位符的使用方法,包括(placeholder,error,fallback)三种占位符

1.placeholder   正在请求图片的时候展示的图片

2.error             如果请求失败的时候展示的图片(如果没有设置,还是展示placeholder的占位符)

3.fallback       如果请求的url/model为null的时候展示的图片(如果没有设置,还是展示placeholder的占位符)

val requestOption:RequestOptions=RequestOptions()
            .placeholder(R.drawable.load)
            .error(R.drawable.error)
            .fallback(R.drawable.fallback)
        val imageview:ImageView=findViewById(R.id.imageview)
         Glide.with(this)
            .load("https://images.pexels.com/photos/10396930/pexels-photo-10396930.jpeg?cs=srgb&dl=pexels-valeriia-miller-10396930.jpg&fm=jpg")
            .apply(requestOption)
            .into(imageview)

指定图片的大小


Glide不会直接将图片的完整尺寸全部加载到内存中,而是用多少加载多少,Glide会自动判断ImageView的大小,然后只将这么大的图片像素加载到内存当中,帮助我们节省开支。

Glide提供override方法指定图片的尺寸,Glide就只会将图片加载成100*100像素的尺寸,而不会管ImageView的大小。

val requestOption:RequestOptions=RequestOptions()
            .placeholder(R.drawable.load)
            .error(R.drawable.error)
            .fallback(R.drawable.fallback)
            .override(100,100)

过渡动画


定义Glide如何从占位符到新加载的图片,或从缩略图到全尺寸图片过渡

交叉淡入(避免占位图还能显示)

val factory:DrawableCrossFadeFactory=DrawableCrossFadeFactory.Builder()
            .setCrossFadeEnabled(true)
            .build()
Glide.with(this)
            .load("https://images.pexels.com/photos/10396930/pexels-photo-10396930.jpeg?cs=srgb&dl=pexels-valeriia-miller-10396930.jpg&fm=jpg")
            .apply(requestOption)
             .transition(DrawableTransitionOptions.withCrossFade(factory))
            .into(imageview)

图片变换


获取资源并修改它,然后返回被修改后的资源,通常交换操作是用来完成裁剪或对位图应用过滤器。比如对图片进行圆角配置。

1.CircleCrop:圆角

2.RoundedCorners:四个角统一指定

3.GranularRoundedCorners:四个角度单独指定

4.Rotate:旋转

下面我们来试试

1.CircleCrop:圆角

Glide.with(this)
            .load("https://images.pexels.com/photos/10396930/pexels-photo-10396930.jpeg?cs=srgb&dl=pexels-valeriia-miller-10396930.jpg&fm=jpg")
            .apply(requestOption)
             .transform(CircleCrop())
             .into(imageview)

2.RoundedCorners:四个角统一指定

 

Glide.with(this)
            .load("https://images.pexels.com/photos/10396930/pexels-photo-10396930.jpeg?cs=srgb&dl=pexels-valeriia-miller-10396930.jpg&fm=jpg")
            .apply(requestOption)
             .transform(RoundedCorners(80))
             .into(imageview)

3.GranularRoundedCorners:四个角度单独指定

 

Glide.with(this)
            .load("https://images.pexels.com/photos/10396930/pexels-photo-10396930.jpeg?cs=srgb&dl=pexels-valeriia-miller-10396930.jpg&fm=jpg")
            .apply(requestOption)
             .transform(GranularRoundedCorners(30f,80f,80f,30f))
             .into(imageview)

4.Rotate:旋转

Glide.with(this)
            .load("https://images.pexels.com/photos/10396930/pexels-photo-10396930.jpeg?cs=srgb&dl=pexels-valeriia-miller-10396930.jpg&fm=jpg")
            .apply(requestOption)
             .transform(Rotate(90))
             .into(imageview)

Generated API

添加Glide注解处理器的依赖:

plugins {
    ...
    id 'kotlin-kapt'
}
dependencies {
...
kapt 'com.github.bumptech.glide:compiler:4.9.0'
}

新建MyAppModule继承自AppGlideModule,并添加@GlideModule注解:

@GlideModule
class MyAppModule: AppGlideModule() {
}

然后点击Build->Make Module'Glide.app.main',就会自动生成GlideApp类

此时我们能够更简单的完成占位符等配置

GlideApp.with(this)
            .load("https://images.pexels.com/photos/10396930/pexels-photo-10396930.jpeg?cs=srgb&dl=pexels-valeriia-miller-10396930.jpg&fm=jpg")
            .placeholder(R.drawable.load)
目录
相关文章
|
22天前
|
Android开发 UED
Android 中加载 Gif 动画
【10月更文挑战第20天】加载 Gif 动画是 Android 开发中的一项重要技能。通过使用第三方库或自定义实现,可以方便地在应用中展示生动的 Gif 动画。在实际应用中,需要根据具体情况进行合理选择和优化,以确保用户体验和性能的平衡。可以通过不断的实践和探索,进一步掌握在 Android 中加载 Gif 动画的技巧和方法,为开发高质量的 Android 应用提供支持。
|
25天前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
22 1
|
2月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
64 20
Android经典面试题之图片Bitmap怎么做优化
|
30天前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
82 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
1月前
|
Ubuntu Shell API
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
|
3月前
|
编解码 测试技术 Android开发
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
本文详细介绍了如何利用CameraX库实现高质量的照片及视频拍摄功能,包括添加依赖、初始化、权限请求、配置预览与捕获等关键步骤。此外,还特别针对不同分辨率和帧率的视频拍摄提供了性能优化策略,确保应用既高效又稳定。
307 1
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
|
3月前
|
监控 Java API
Android经典实战之OkDownload:一个经典强大的文件下载开源库,支持断点续传
本文介绍的 OkDownload 是一个专为 Android 设计的开源下载框架,支持多线程下载、断点续传和任务队列管理等功能,具备可靠性、灵活性和高性能特点。它提供了多种配置选项和监听器,便于开发者集成和扩展。尽管已多年未更新,但依然适用于大多数文件下载需求。
355 1
|
3月前
|
API Android开发
Android项目架构设计问题之选择和使用合适的UI库如何解决
Android项目架构设计问题之选择和使用合适的UI库如何解决
48 0
|
3月前
|
数据处理 开发工具 数据安全/隐私保护
Android平台RTMP推送|轻量级RTSP服务|GB28181接入之文字、png图片水印的精进之路
本文探讨了Android平台上推流模块中添加文字与PNG水印的技术演进。自2015年起,为了满足应急指挥及安防领域的需求,逐步发展出三代水印技术:第一代为静态文字与图像水印;第二代实现了动态更新水印内容的能力,例如实时位置与时间信息;至第三代,则优化了数据传输效率,直接使用Bitmap对象传递水印数据至JNI层,减少了内存拷贝次数。这些迭代不仅提升了用户体验和技术效率,也体现了开发者追求极致与不断创新的精神。
|
3月前
|
自然语言处理 定位技术 API
Android经典实战之如何获取图片的经纬度以及如何根据经纬度获取对应的地点名称
本文介绍如何在Android中从图片提取地理位置信息并转换为地址。首先利用`ExifInterface`获取图片内的经纬度,然后通过`Geocoder`将经纬度转为地址。注意操作需在子线程进行且考虑多语言支持。
227 4