imageview代码示例怎么用?,有哪些注意事项?

ImageView是Android开发中最基础的图片显示控件,核心用法就是通过setImageResource()setImageBitmap()把图片资源塞进去,配合ScaleType控制缩放模式,但真正写好它需要处理内存复用、加载策略和裁剪细节。

很多初级开发者在ListView或RecyclerView里直接加载本地图片,结果滑动卡顿甚至OOM崩溃,问题不在ImageView本身,而是没有理解它的工作边界,下面直接拆解日常开发里最常用的几个代码场景,从基础属性到进阶封装,每一步都给出可复制的写法。

29使用代码修改ImageView
加载中
29使用代码修改ImageView

ImageView基础用法与src和background的区别

ImageView在XML布局里最常用的属性是srcbackground,新手经常混用,但两者的行为差异很大。

src设置的是图片内容,会按照scaleType属性缩放;background设置的是背景,默认拉伸填充整个View区域,如果同时设置两者,前景图会盖在背景上面,实际开发中,背景通常放纯色或渐变Drawable,内容图放src,这样逻辑清晰,也方便做占位图。

<ImageView
    android:id="@+id/iv_avatar"
    android:layout_width="80dp"
    android:layout_height="80dp"
    android:src="@drawable/ic_default_avatar"
    android:background="@drawable/bg_circle_white"
    android:scaleType="centerCrop" />

scaleType是最容易忽略的属性,它决定了图片在View里怎么缩放,常用的几个值:

  • centerCrop:按比例放大或缩小使得图片填满View,超出部分裁剪,适合头像、封面图。
  • fitCenter:按比例缩放使得整张图完整显示在View内,可能留白,适合展示完整图片。
  • fitXY:不保持比例,拉伸填满View,容易变形,一般不用。
  • center:不做缩放,居中显示原图,大图会溢出不显示。

Java/Kotlin代码里动态设置也一样:

imageView.setImageResource(R.drawable.ic_place_holder)
imageView.scaleType = ImageView.ScaleType.CENTER_CROP

ImageView加载大图OOM怎么解决

这是百度搜索里出现频率很高的长尾词,“imageview加载大图oom怎么解决”,一张几MB的图片直接setImageResource(),在内存里解码后可能膨胀到几十MB,低端机上必崩。

行业共识是:不要在UI线程直接解码大图,正确做法是先读取图片的尺寸信息,再根据ImageView的实际大小进行采样压缩。

imageview代码示例怎么用?,有哪些注意事项?

fun loadSampledBitmap(resId: Int, reqWidth: Int, reqHeight: Int): Bitmap {
    val boundsOptions = BitmapFactory.Options().apply {
        inJustDecodeBounds = true
    }
    BitmapFactory.decodeResource(resources, resId, boundsOptions)
    val inSampleSize = calculateInSampleSize(boundsOptions, reqWidth, reqHeight)
    val decodeOptions = BitmapFactory.Options().apply {
        this.inSampleSize = inSampleSize
        inPreferredConfig = Bitmap.Config.RGB_565
    }
    return BitmapFactory.decodeResource(resources, resId, decodeOptions)
}
fun calculateInSampleSize(options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int): Int {
    val (height: Int, width: Int) = options.outHeight to options.outWidth
    var inSampleSize = 1
    if (height > reqHeight || width > reqWidth) {
        val halfHeight = height / 2
        val halfWidth = width / 2
        while (halfHeight / inSampleSize >= reqHeight && halfWidth / inSampleSize >= reqWidth) {
            inSampleSize = 2
        }
    }
    return inSampleSize
}

这个calculateInSampleSize方法就是业内常用的采样率计算逻辑。inJustDecodeBounds为true时只读尺寸不解码像素,开销极小,拿到采样率后再正式解码,内存占用可以降到原来的1/4甚至1/8。

inPreferredConfig设为RGB_565,每个像素只占2字节,相比默认的ARGB_8888少一半内存,但注意,RGB_565不支持透明通道,带透明度的PNG图片会显示黑色背景,需要保留透明度的场景不要用这个配置。

ImageView和Glide怎么选:对比与配合

很多开发者纠结“imageview和glide区别”,其实两者不是替代关系,Glide本身就是基于ImageView工作的,Glide负责加载、缓存、解码,最后把Bitmap或者Drawable设置到ImageView上。

选型建议:

  • 简单场景、少量本地图片:直接用ImageView配合BitmapFactory,不引入额外依赖。
  • 网络图片、列表加载、需要缓存:用Glide,它能解决大部分性能问题。
Glide.with(this)
    .load("https://example.com/image.jpg")
    .placeholder(R.drawable.ic_default)
    .error(R.drawable.ic_error)
    .override(300, 300)
    .centerCrop()
    .into(imageView)

override()指定加载尺寸,源码内部会先查缓存,再决定是否压缩,列表滑动时Glide自动复用ImageView的bitmap,避免GC抖动。实际项目中,90%以上的图片加载任务交给Glide是稳妥的,自己写原生解码容易踩坑。

但Glide也不是万能,如果图片需要频繁修改像素(比如拍照后的水印合成),还是得用原生Bitmap操作,Glide适合展示,不适合加工。

imageview代码示例怎么用?,有哪些注意事项?

ImageView实现圆角和圆形图片的代码示例

UI设计里圆角头像、圆形logo是标配,实现方式有两种:原生ShapeableImageView或者自定义BitmapShader

ShapeableImageView是Material库提供的控件,代码简洁,适合圆角固定不变的场景

<com.google.android.material.imageview.ShapeableImageView
    android:id="@+id/iv_round"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:src="@drawable/ic_avatar"
    app:shapeAppearanceOverlay="@style/ShapeAppearance.App.CornerSize" />

对应样式:

<style name="ShapeAppearance.App.CornerSize">
    <item name="cornerSize">16dp</item>
</style>

圆形只要把cornerSize设为50%即可,这种方式处理静态UI高效,但动态改圆角大小比较麻烦。

自定义BitmapShader适合需要动态控制圆角程度的场景,核心思路是,把Bitmap作为Shader绘制到圆角矩形路径里。

class RoundImageView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : AppCompatImageView(context, attrs, defStyleAttr) {
    private val path = Path()
    private val paint = Paint(Paint.ANTI_ALIAS_FLAG)
    private var radius = 0f
    override fun onDraw(canvas: Canvas) {
        val bitmap = getBitmapFromDrawable() ?: return
        val shader = BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)
        paint.shader = shader
        path.reset()
        path.addRoundRect(RectF(0f, 0f, width.toFloat(), height.toFloat()), radius, radius, Path.Direction.CW)
        canvas.drawPath(path, paint)
    }
}

这段代码里的getBitmapFromDrawable()需要自己实现,从drawable里取出Bitmap,注意Glide加载的图片要等回调拿到Bitmap后再设置给自定义View。

ImageView在RecyclerView中的复用与性能优化

列表滑动卡顿的常见原因就是ImageView在复用过程中频繁触发解码。RecyclerView的ViewHolder复用机制下,ImageView被反复setImageResource,每次都是重新解码,这是性能瓶颈

优化思路有三个层面:

  • 使用Glide并开启缓存,diskCacheStrategy设为ALL,避免重复网络请求。
  • onBindViewHolder里使用Glide.with(holder.itemView.context).load(...).into(holder.imageView)

    imageview代码示例怎么用?,有哪些注意事项?

    ,不要自己new Bitmap。

  • 图片尺寸提前裁剪,列表缩略图用override()固定到列表项大小,避免加载原图。
override fun onBindViewHolder(holder: ViewHolder, position: Int) {    val item = dataList[position]    Glide.with(holder.itemView.context)        .load(item.thumbnailUrl)        .override(200, 200)        .centerCrop()        .into(holder.imageView)}

固定尺寸的override配合centerCrop,是列表图片性能优化的标准写Fa,Glide会先查内存缓存,再查磁盘缓存,最后才走网络,滑动时上一个Item的加载请求会被自动取消,不会出现图片错位。

图片错位问题排查

错位的根源是ViewHolder复用导致旧图片还没来得及显示,新请求就到了,Glide的into()方法内部会处理这种情况,但如果你用原生setImageBitmap,必须在绑定数据时先清空ImageView:

holder.imageView.setImageDrawable(null)

这一行放在加载新图之前,能避免大部分错位问题。

Q&A:ImageView高频疑问解答

ImageView的adjustViewBounds属性有什么用

当ImageView的宽高至少有一个是wrap_content时,adjustViewBounds设为true可以让ImageView的尺寸根据图片的宽高比自动调整,典型的场景是聊天界面里的图片消息,宽度固定,高度根据图片比例自适应,注意,这个属性只在src有效时起作用,对background无效。

ImageView设置图片后内存仍然偏高怎么办

先用BitmapFactory.OptionsinJustDecodeBounds检查图片原始尺寸,如果原始尺寸是4000×3000,而显示区域只有200×200,采样率至少设置为8,另外检查是否引用了大图资源,Android drawable目录的密度限定也会影响解码后的像素尺寸,把图片放到drawable-nodpi可以避免自动缩放,如果用了Glide,确认override()设置了合理的尺寸,并且skipMemoryCache()没有被误调用。

Glide加载的图片怎么转成Bitmap操作

into()之前用addListener或者在asBitmap()回调里获取,推荐用asBitmap()配合into(new SimpleTarget,但SimpleTarget已废弃,新版本用CustomTarget,拿到Bitmap后做水印、裁剪、滤镜处理,再setImageBitmap给ImageView,注意CustomTarget持有外部Context时需要处理生命周期,避免内存泄漏。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/article/556433.html

(0)
服务器内存如何查看?,linux怎么查看内存使用情况?
上一篇 2026年8月8日 09:27
importnew是什么网站,Java新手学习网站哪里找?
下一篇 2026年8月8日 09:29

相关推荐

  • IDC中国存储市场排名如何?,最新方案有哪些?

    根据IDC历年跟踪数据,中国存储市场排名前五的厂商依次为华为、新华三、浪潮、戴尔科技和联想,而企业级存储方案正加速向全闪存与分布式架构演进,混合云与数据智能场景成为选型关键分水岭,2025年idc中国存储市场排名有哪些变化?排名前五厂商格局稳定但份额微调从IDC发布的《中国存储市场季度跟踪报告》来看,近两年头部……

    2026年8月21日
    900
  • 服务器管理员账号sa到底是什么,怎么设置密码?

    服务器管理员账号sa是SQL Server的默认系统管理员账户,拥有数据库最高权限,其安全性直接决定数据库的安危,什么是sa账号?理解服务器管理员账号的核心角色sa账号从SQL Server诞生之初就存在,是安装程序自动创建的登录名,属于sysadmin固定服务器角色,这意味着sa账号可以执行服务器实例内的所有……

    2026年7月22日
    300
  • 服务器mysql数据库怎么备份?mysql数据库自动备份脚本

    服务器MySQL数据库备份的核心在于建立“本地快照+异地归档+定期验证”的闭环体系,单纯依赖单一备份方式无法应对数据丢失风险,在数字化运营中,数据库是企业的数字资产心脏,一旦遭遇硬件故障、误删表或勒索病毒攻击,没有备份意味着业务直接停摆,业内专家指出,数据恢复的成功率与备份策略的完整性呈正相关,许多中小企业主往……

    2026年7月7日
    12600
  • 如何查看IIS网站启动日志及启动/停止IIS服务?,怎么设置

    IIS网站启动日志记录了服务启动与停止的完整过程,是排查IIS服务故障的关键工具,通过分析启动日志,可以快速定位服务启动失败的原因,优化网站性能,行业共识认为,日志管理是网站运维的基础,能有效减少停机时间,近年来,日志分析在故障排查中的作用越来越重要,IIS服务启动失败原因与日志排查方法日志文件位置与访问方式I……

    2026年8月5日
    1200
  • IT网站建设与制度建设如何结合,有哪些方法?

    IT网站建设从来不是单纯的技术实现,更关键的是一套成熟的制度建设,它决定了项目能否按时交付、预算是否可控、质量是否达标, 行业共识认为,超过半数以上建设周期延长的项目,都与制度缺失直接相关,没有规矩,再好的技术团队也容易陷入混乱,IT网站建设流程制度,让项目不再失控很多团队在启动IT网站建设时,往往急着选技术……

    2026年8月11日
    900
  • ibooks和直播录制各支持什么格式,格式不兼容怎么办?

    ibooks原生支持EPUB和PDF两种格式,直播录制最通用的录制格式是MP4,播放格式也以MP4为首选,但具体需根据平台需求调整编码和分辨率, 若不考虑版权限制,iBooks也能通过转换间接阅读其他格式;直播录制时,FLV和TS格式常用于低延迟场景,但播放兼容性不如MP4,ibooks支持什么格式iBooks……

    2026年8月20日
    1300
  • 服务器IP域名解析为何总失败,服务器IP域名解析失败如何解决

    服务器IP域名解析,本质就是把域名翻译成服务器IP地址的过程,让用户通过域名就能访问你的网站,而不用记复杂的数字IP,服务器IP域名解析:从域名到IP的“翻译官”你肯定遇到过这种情况:想访问某个网站,在浏览器输入一串网址,www.example.com”,啪的一下页面就打开了,背后默默干活的,就是DNS服务器……

    2026年7月29日
    400
  • 服务器和客户端不在一个网段怎么办?不同网段通信配置方法

    服务器和客户端不在一个网段时,核心解决方案是通过配置路由器或三层交换机进行路由转发,确保双方拥有正确的默认网关及回程路由,从而实现跨网段通信,跨网段通信背后的网络逻辑很多人以为只要网线插上,IP地址填好,两台设备就能说话,其实不然,当服务器和客户端处于不同网段时,它们就像住在两个不同小区的人,中间隔着一条马路……

    2026年7月8日
    4100
  • 如何规划IP摄像头的QoS策略数据,具体操作步骤有哪些

    IP摄像头的QoS策略数据规划,核心是为视频流在网络拥塞时提供优先保障,通过合理的带宽预留和优先级标记,让监控画面在复杂环境下依然清晰流畅,为什么网络摄像头必须重视QoS策略规划多路摄像头同时上传视频流,一旦遇到带宽瓶颈,丢包和延迟就会直接导致画面卡顿、花屏甚至断流,行业共识认为,实时视频对网络抖动的容忍度极低……

    2026年8月20日
    800
  • 服务器生产厂家如何选择?,哪家性价比高?

    选择服务器生产厂家,关键在于将业务负载、运维能力和预算三者结合匹配,不存在通吃所有场景的品牌,唯有适合自己的才是明智之选,不论是传统行业还是新兴互联网公司,服务器都是基础设施的核心,近年来,服务器生产厂家阵营逐渐分化为国际派和国产派,前者在高端市场和全球服务上积累深厚,后者在定制响应和信创合规上后发优势明显,下……

    AI资讯 2026年7月17日
    2800

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注