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

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

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

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

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

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

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.Options的inJustDecodeBounds检查图片原始尺寸,如果原始尺寸是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://test.idctop.com/article/556433.html

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

相关推荐

  • iis7怎么安装php网站?php安装步骤有哪些

    在IIS7上安装PHP并运行网站,核心是采用FastCGI模式部署PHP,正确配置处理程序映射与权限,并确保PHP环境与IIS兼容,安装前的环境准备检查IIS7组件是否完整IIS7默认不安装CGI和FastCGI模块,需要手动添加,打开“控制面板” -> “程序和功能” -> “打开或关闭Windo……

    2026年8月13日
    300
  • AI大模型和普通模型有啥区别?大模型和普通模型的区别

    AI大模型并非单一技术,而是基于海量数据训练、具备通用推理能力的底层基础模型;而“模型”是更广泛的概念,既包含这些通用大模型,也涵盖针对特定任务微调或训练的专业小模型,二者是“地基”与“建筑”的关系,很多人听到“AI模型”和“AI大模型”时,容易把它们混为一谈,觉得都是人工智能,这种认知偏差会导致在选型时出现巨……

    2026年6月15日
    2300
  • 如何选择靠谱的服务器代工厂,哪家性价比高?

    选择服务器代工厂,核心在于评估其定制能力、认证资质和供应链稳定性,而非单纯比价,服务器代工厂哪家好?从产能和资质看实力不少采购方在寻找合作时,会把“服务器代工厂哪家好”当成首要问题,但好与不好,不能只看销售话术,而要看硬指标,产能规模:月产能是交付能力的直接体现,大型代工厂月产能可达数万台,能应对紧急订单;中小……

    2026年7月22日
    1700
  • 大模型微调数据集版本怎么管?数据版本管理最佳实践

    大模型微调数据集版本管理的核心在于建立“数据-实验-模型”的闭环追踪体系,通过引入DVC或LakeFS等工具实现数据快照、元数据关联及一键回滚,从而解决模型迭代中的不可复现性与数据漂移问题,在人工智能落地应用的深水区,许多团队往往痴迷于模型架构的优化,却忽视了作为燃料的数据管理,业内专家指出,数据质量的微小波动……

    2026年6月17日
    2600
  • 服务器架设技术难吗,新手如何搭建个人服务器

    服务器架设(Server Deployment/Setup)是一个系统工程,涉及硬件选择、操作系统安装、网络配置、服务部署以及安全加固等多个环节,以下是一份从零基础到生产环境的服务器架设全流程指南,涵盖物理服务器和云服务器两种场景,第一阶段:需求分析与规划在动手之前,必须明确“你要搭建什么类型的服务器”?业务类……

    2026年7月11日
    16300
  • 分布式缓存软件怎么选?分布式缓存软件有哪些

    分布式缓存软件是现代高性能应用架构中的核心组件,主要用于减轻数据库压力、提高数据读取速度以及实现会话共享等功能,以下是目前市场上主流、成熟的分布式缓存软件分类及详细介绍,涵盖开源方案和商业方案: 主流开源分布式缓存Redis (最主流)特点:基于内存的 Key-Value 存储,支持多种数据结构(String……

    2026年7月12日
    17400
  • iframe框架怎么用?,如何解决跨域问题?

    iframe框架就是网页中嵌入另一个网页的“窗口”,它像一个独立的小浏览器,能直接在当前页面里展示外部内容, 它用起来简单,但坑也不少,本文用大白话把它的原理、用法、常见问题和SEO影响一次说透,iframe框架的基础概念与核心属性iframe全称是inline frame,中文叫内联框架, 说白了,它就是HT……

    2026年8月6日
    700
  • 大模型治理是什么?大模型治理平台有哪些

    大模型治理的核心在于建立“技术可控、合规合法、价值对齐”的闭环体系,通过全生命周期的风险管理确保AI安全落地,随着生成式人工智能从概念验证走向大规模商业应用,单纯追求参数规模的时代已经过去,2026年的行业共识是,没有治理的大模型如同没有刹车的跑车,跑得越快,风险越高,企业若想在激烈的市场竞争中存活,必须将治理……

    2026年6月20日
    2200
  • 服务器上的主机号是什么意思,怎么查服务器上的主机号?

    服务器上的主机号是IP地址中用于标识特定设备的部分,它必须与子网掩码配合使用才能准确划分网络边界, 理解主机号是网络管理的基础,无论你是配置云服务器还是排查本地网络,都需要清楚主机号如何确定、如何查询,以及它与IP地址其他部分的关系,服务器主机号是什么:理解网络身份的核心主机号,简单说就是IP地址中属于“设备自……

    2026年7月26日
    1600
  • IIS自带https证书怎么管理?,证书过期怎么办

    IIS自带的HTTPS证书本质是自签名证书,仅适合开发与内部测试,生产环境必须使用受信任的证书颁发机构(CA)签发的证书,证书管理涉及从生成、申请、安装到续期的全流程,合理选择与配置能兼顾安全与成本,理解IIS自带的HTTPS证书IIS自签名证书是如何生成的IIS在安装时会自动生成一个自签名证书,用于快速启用H……

    2026年8月21日
    300

发表回复

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