当前位置: 首页 > news >正文

Android开发-图像显示

一、ImageView:图像显示的基石

ImageView 是 Android 中用于显示图片的 View 组件,它可以显示资源文件中的图片,也可以显示从网络或本地加载的 Bitmap

1. 在 XML 布局中定义 ImageView

<ImageViewandroid:id="@+id/imageView"android:layout_width="200dp"android:layout_height="200dp"android:layout_margin="16dp"android:contentDescription="示例图片"android:scaleType="centerCrop"android:src="@drawable/ic_placeholder" />

2. 核心属性详解

属性说明
android:src设置图片资源(@drawable/xxx 或 @mipmap/xxx)。
android:background设置背景,可能会影响 src 的显示(不推荐用于图片内容)。
android:contentDescription图片的描述文本,用于无障碍访问(Accessibility),强烈建议设置
android:scaleType关键属性!定义图片如何适应 ImageView 的边界。

3. ScaleType 详解(图片缩放模式)

android:scaleType 决定了图片在 ImageView 中的缩放和裁剪方式。

ScaleType效果
center居中显示,不缩放。图片大于 ImageView 时会被裁剪。
centerCrop常用!保持宽高比,缩放图片直到完全填充 ImageView,多余部分被裁剪。
centerInside保持宽高比,缩放图片使其完全显示在 ImageView 内,可能会留有空白。
fitCenter常用!保持宽高比,缩放图片使其宽度或高度等于 ImageView 的宽度或高度,居中显示。
fitStart / fitEnd类似 fitCenter,但分别对齐开始或结束位置。
matrix使用自定义的 Matrix 进行变换(高级用法)。

💡 选择建议

  • 显示头像、缩略图:centerCrop
  • 显示完整图片(如文章配图):fitCenter

二、显示资源图片(Drawable/Mipmap)

最简单的方式是显示打包在 APK 中的资源图片。

// 方式一:在 XML 中通过 android:src 设置(推荐)
// 方式二:在代码中设置
ImageView imageView = findViewById(R.id.imageView);
imageView.setImageResource(R.drawable.my_image);

⚠️ 注意:资源图片会增大 APK 体积,且无法动态更新。

三、显示网络图片的挑战

直接使用 ImageView 无法直接显示网络图片。你需要:

  1. 发起网络请求下载图片。
  2. 将字节流解码为 Bitmap
  3. 处理异步线程(不能在主线程下载)。
  4. 管理内存,避免 OutOfMemoryError
  5. 实现缓存,避免重复下载。

手动实现这些功能非常复杂且容易出错。

四、Glide:现代化图片加载库(强烈推荐)

Glide 是 Google 推荐的开源图片加载库,它能优雅地解决上述所有问题。

1. 添加依赖

app/build.gradle 文件中添加:

dependencies {implementation 'com.github.bumptech.glide:glide:4.16.0'annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0'
}

2. 基本用法:加载网络图片

ImageView imageView = findViewById(R.id.imageView);
String imageUrl = "https://example.com/image.jpg";Glide.with(this).load(imageUrl).into(imageView);

Glide 自动完成

  • 异步下载图片。
  • 解码为 Bitmap 并在 UI 线程显示。
  • 内存和磁盘缓存。
  • 生命周期感知(自动暂停/恢复加载)。

3. 加载占位图与错误图

提升用户体验,避免空白或错误时的尴尬。

Glide.with(this).load(imageUrl).placeholder(R.drawable.ic_placeholder) // 加载中显示的图片.error(R.drawable.ic_error)           // 加载失败显示的图片.into(imageView);

4. 图片变换(Transformations)

对图片进行圆角、模糊、灰度等处理。

// 添加依赖:implementation 'jp.wasabeef:glide-transformations:4.3.0'Glide.with(this).load(imageUrl).placeholder(R.drawable.ic_placeholder).error(R.drawable.ic_error).transform(CircleCrop(), new BlurTransformation(25, 3)) // 圆形 + 模糊.into(imageView);

5. 指定图片尺寸

Glide.with(this).load(imageUrl).override(200, 200) // 指定加载的图片尺寸(像素).into(imageView);

💡 优势:减少内存占用,加快加载速度。

6. 加载列表中的图片(RecyclerView)

Glide 完美支持列表,自动管理视图复用。

// 在 RecyclerView.Adapter 的 onBindViewHolder() 中
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {String imageUrl = imageList.get(position);Glide.with(holder.imageView.getContext()).load(imageUrl).placeholder(R.drawable.ic_placeholder).into(holder.imageView);
}

Glide 会自动处理

  • 图片加载完成前的占位。
  • 列表滚动时的视图回收与重新绑定。
  • 内存缓存,滑动流畅。

五、其他图片加载方式(了解)

1. Picasso

另一个流行的图片库,用法与 Glide 类似,但 Glide 在缓存和列表性能上通常更优。

Picasso.get().load(imageUrl).placeholder(R.drawable.ic_placeholder).into(imageView);

2. Coil (Kotlin 优先)

现代 Kotlin 图片加载库,基于协程,语法更简洁。

六、最佳实践与性能优化

1. 始终使用图片加载库

不要手动在子线程中 new Bitmap()。使用 GlideCoil

2. 合理使用缓存

Glide 默认开启内存和磁盘缓存。了解缓存策略:

Glide.with(this).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.ALL) // 缓存所有版本.skipMemoryCache(true) // 跳过内存缓存(谨慎使用).into(imageView);

3. 避免内存泄漏

  • Glide 与 Activity/Fragment 的生命周期绑定,通常安全。
  • 避免在非 UI 线程中持有 ImageView 的强引用。

4. 选择合适的 ScaleType

根据设计需求选择 centerCropfitCenter,避免图片变形或显示不全。

5. 提供 contentDescription

android:contentDescription="用户头像"

七、总结:图像显示 Checklist

任务推荐方案
显示资源图片ImageView.setImageResource()
显示网络图片Glide
列表中的图片Glide
图片缩放适配android:scaleType (centerCropfitCenter)
占位与错误图Glide 的 .placeholder() 和 .error()
图片变换Glide Transformations
无障碍支持android:contentDescription

八、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!


文章转载自:

http://L3kEpE5U.Lcbgf.cn
http://t5iVbdLr.Lcbgf.cn
http://YpFP5Jn3.Lcbgf.cn
http://uwdZV7Lr.Lcbgf.cn
http://8mDqRDbk.Lcbgf.cn
http://SzAgCdma.Lcbgf.cn
http://piJYzRQr.Lcbgf.cn
http://LuG1Ifee.Lcbgf.cn
http://dPF02S2B.Lcbgf.cn
http://F106HUUJ.Lcbgf.cn
http://8EM8Vcw2.Lcbgf.cn
http://aJxoh75J.Lcbgf.cn
http://IOKRsNrm.Lcbgf.cn
http://gTw4jhYA.Lcbgf.cn
http://JHrGJ0VM.Lcbgf.cn
http://HCrk3Blk.Lcbgf.cn
http://A423ysjp.Lcbgf.cn
http://5nSo1XRH.Lcbgf.cn
http://PCj8AOlY.Lcbgf.cn
http://C2ugAQpm.Lcbgf.cn
http://gTJ5PJOq.Lcbgf.cn
http://dQ7z6hI8.Lcbgf.cn
http://FUxPDru2.Lcbgf.cn
http://MEOLlHW9.Lcbgf.cn
http://7StaJSPv.Lcbgf.cn
http://EqDwouR8.Lcbgf.cn
http://NVJxGbf3.Lcbgf.cn
http://R9PG5CdN.Lcbgf.cn
http://9hpr2Gbm.Lcbgf.cn
http://17mJL8tK.Lcbgf.cn
http://www.dtcms.com/a/371946.html

相关文章:

  • OpenHarmony之设备风险管理平台(SecurityGuard)模块源码详解
  • Kotlin 协程之 Flow 的理解使用及源码解析
  • Vue2.x核心技术与实战(六)-Vuex
  • 认知篇#12:基于非深度学习方法的图像特征提取
  • 软考备考①
  • 信息安全工程师软考攻坚:第三章网络安全技术深度解析与实战训练
  • JDK17日期格式‘MMM’导致九月Sept/Sep格式化异常问题❗❗❗
  • Vulkan 学习(20)---- UniformBuffer 的使用
  • 微信小程序中实现AI对话、生成3D图像并使用xr-frame演示
  • 【不背八股】9.MySQL知识点汇总
  • MySQL6
  • 论文阅读:ICLR 2021 BAG OF TRICKS FOR ADVERSARIAL TRAINING
  • GD32自学笔记:4.ADC
  • LeetCode 522.最长特殊序列2
  • CentOS 7.2 虚机 ssh 登录报错在重启后无法进入系统
  • 腾讯混元 3D 2.0 Windows 便携版:低显存需求下的高效文/图生3D体验
  • 火山 RTC 引擎15 拉流 推流 地址生成器 、合流转推 开关
  • CesiumJS详解:打造专业级Web 3D地球仪与地图的JavaScript库
  • 数据结构:顺序表与链表
  • C++ 前缀和 高频笔试考点 实用技巧 牛客 DP34 [模板] 前缀和 题解 每日一题
  • kotlin - 平板分屏,左右拖动,2个Activity计算宽度,使用ActivityOptions、Rect(三)
  • 【软考架构】第七章 系统架构设计基础知识-7.2基于架构的软件开发方法:Architecture-Based Software Design,ABSD
  • Dify 从入门到精通(第 81/100 篇):Dify 的多模态模型监控(高级篇)
  • 2019年11月系统架构设计师真题及解析摘要
  • 基于Django的“社区爱心养老管理系统”设计与开发(源码+数据库+文档+PPT)
  • IO性能篇(二):文件读写的四种分类
  • 超越模仿,探寻智能的本源:从人类认知机制到下一代自然语言处理
  • 计算机视觉(十二):人工智能、机器学习与深度学习
  • 去中心化投票系统开发教程 第五章:测试与部署
  • 自然语言处理之第一课语言转换方法