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

相关推荐

  • 服务器443端口无法访问是什么原因,怎么解决

    服务器443端口是HTTPS加密通信的默认端口,正确配置后能确保网站数据传输安全,是提升用户信任和搜索引擎排名的关键,服务器443端口是什么?为什么它是网站标配443端口的基本概念服务器443端口对应HTTPS协议,用于传输加密后的网页数据,当你在浏览器地址栏看到小锁标志,数据就是通过这个端口进出,没有443端……

    2026年7月21日
    200
  • 服务器自己做云靠谱吗,个人搭建云服务器教程

    服务器自己做云的核心答案是利用开源虚拟化技术(如Proxmox VE、Unraid或TrueNAS)将闲置硬件整合为私有云,虽无需支付高昂订阅费,但需承担硬件折旧、电力成本及自行维护的技术门槛,适合具备一定IT基础且重视数据隐私的个人或小微企业,自建私有云并非简单的“插上网线”,而是一场关于资源调度、数据安全与……

    2026年7月3日
    18400
  • IDC类域名有哪些主要类型?,怎么选择?

    IDC类域名并非一个官方域名分类,而是指在互联网数据中心业务中高频使用的域名,其选择直接影响网站访问速度和稳定性,因此需要从后缀、解析、备案等多维度综合考量,IDC域名是什么?和普通域名有哪些区别IDC域名,从实际应用角度来说,是指用于托管在IDC机房、承载服务器或云资源的域名,这类域名和普通个人博客或企业展示……

    2026年8月6日
    200
  • 服务器客户端连接超时怎么办?如何解决连接超时

    服务器客户端连接超时通常由网络延迟、防火墙拦截或服务器负载过高引起,首要排查步骤是检查本地网络连通性及服务器端口开放状态,连接超时的核心成因深度解析当你的应用试图与远程服务器建立通信时,如果在规定时间内没有收到响应,就会触发超时机制,这不仅仅是“网不好”那么简单,背后往往隐藏着复杂的网络链路问题或服务器配置陷阱……

    2026年7月7日
    23900
  • 服务器温度软件哪个好?,服务器温度过高怎么办?

    服务器温度监控软件的核心价值在于提前预警硬件故障与性能降频,根据你的服务器硬件和操作系统选择对应的开源或商业工具,是保障业务稳定性的关键一步,服务器温度监控软件哪个好?开源与商业方案全面对比选择温度监控软件,首先要明确你的硬件平台和运维水平,Linux服务器通常首选开源工具,而Windows环境或特定品牌硬件……

    2026年7月27日
    500
  • Ollama怎么用宝塔面板管理?宝塔面板安装Ollama详细教程

    通过宝塔面板管理Ollama的核心逻辑是:利用宝塔的Nginx反向代理功能,将本地运行的Ollama服务映射为可公网访问的安全接口,并配合Docker容器化部署实现自动化运维,在2026年的AI应用落地场景中,本地大模型部署已成为许多开发者和中小企业的刚需,相比于依赖云端API的高昂成本和隐私泄露风险,本地部署……

    2026年6月19日
    2400
  • 服务器mysql数据库怎么优化?mysql数据库优化方案

    服务器MySQL数据库的核心价值在于通过合理的架构设计与参数调优,实现高并发下的数据稳定读写与毫秒级响应,这是构建高性能Web应用的基础,在现代互联网架构中,数据库往往被视为系统的“心脏”,一旦心脏停跳或供血不足,整个业务链条就会瞬间瘫痪,对于运维人员和开发者而言,MySQL不仅是存储数据的容器,更是需要精心呵……

    2026年7月7日
    11600
  • 服务器规范步骤怎么做?服务器配置规范详细流程

    服务器规范步骤通常指的是在服务器部署、配置、运维和管理过程中需要遵循的标准操作流程(SOP),这些步骤旨在确保服务器的安全性、稳定性、可维护性和合规性,以下是一个通用的、专业的服务器规范步骤指南,分为几个关键阶段: 规划与设计阶段需求分析明确服务器用途(Web服务、数据库、文件存储、计算集群等),确定硬件配置……

    2026年7月11日
    19900
  • IIS未发送数据库和主机未安装IIS怎么回事,怎么解决?

    主机未安装IIS或IIS配置缺失数据库驱动时,会导致“iis未发送任何数据库”错误,核心解决方法是正确安装IIS并启用相关数据库组件,无需额外付费,理解“iis未发送任何数据库”错误的真实原因当你在Windows服务器上部署网站,用户反馈页面无法加载,或者你直接在服务器上测试时看到类似“iis未发送任何数据库……

    2026年8月5日
    400
  • AI大模型国学真的能学好吗?大模型国学学习平台推荐

    AI大模型国学并非玄学噱头,而是通过自然语言处理技术,将传统典籍结构化、场景化,为现代人提供个性化、可交互的文化学习与心理疗愈方案,AI如何重构国学学习的底层逻辑过去我们接触国学,往往是从《论语》《道德经》等厚重典籍入手,面对晦涩的文言文,多数人止步于“只可远观”,大模型技术打破了这一壁垒,它不再是简单的搜索引……

    2026年6月16日
    3100

发表回复

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