You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Glide 3.7.0加载图片异常求助:占位图与原图各显示一半

问题描述

图片加载异常:占位图与原图各显示一半

如图所示,图片无法完全加载,出现占位图与原图各显示一半的情况,有时加载又完全正常,不清楚原因。

我使用的依赖版本为:

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

我的代码如下:

val headerView = nav_view.getHeaderView(0) 
Glide.with(act).load(userdata.image).placeholder(R.drawable.ic_male).thumbnail(0.2f).into(headerView.imgNavDp)

XML布局代码:

<de.hdodenhof.circleimageview.CircleImageView 
    android:layout_marginLeft="@dimen/dim_5" 
    android:id="@+id/imgNavDp" 
    android:layout_width="@dimen/dim_76" 
    android:layout_height="@dimen/dim_76" 
    android:elevation="@dimen/dim_10" 
    android:layout_gravity="center_vertical" 
    app:srcCompat="@mipmap/ic_launcher_round" />

解决方案

嘿,这个问题我之前在项目里也踩过坑,大概率是旧版Glide和CircleImageView的适配冲突导致的,给你几个靠谱的解决方向:

1. 优先升级Glide版本(最推荐)

Glide 3.7.0是比较老旧的版本了,对自定义圆形ImageView的支持存在不少兼容性问题,新版Glide(比如4.x系列)修复了很多这类渲染冲突。

升级后的依赖配置:

implementation 'com.github.bumptech.glide:glide:4.15.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.15.1'

对应的加载代码调整(用RequestOptions替代旧版API):

val headerView = nav_view.getHeaderView(0)
val options = RequestOptions()
    .placeholder(R.drawable.ic_male)
    .circleCrop() // 直接用Glide自带的圆形裁剪,甚至可以不用CircleImageView控件了
Glide.with(act)
    .load(userdata.image)
    .apply(options)
    .into(headerView.imgNavDp)

如果不想替换CircleImageView,升级Glide后也能大幅降低这类半图加载的概率。

2. 去掉缩略图加载试试

你代码里的thumbnail(0.2f)可能会导致Glide同时加载缩略图和原图,CircleImageView的裁剪逻辑在处理两张图切换时容易出现渲染异常。先把这个参数去掉,看看问题是否消失:

Glide.with(act)
    .load(userdata.image)
    .placeholder(R.drawable.ic_male)
    .into(headerView.imgNavDp)

3. 调整CircleImageView的布局属性

布局里的app:srcCompat和android:elevation可能会和Glide的加载流程冲突:

  • 去掉app:srcCompat="@mipmap/ic_launcher_round",因为Glide加载时会替换图片资源,初始的srcCompat可能导致渲染层级混乱;
  • 暂时移除android:elevation="@dimen/dim_10",阴影层级可能会干扰图片的正常裁剪显示,确认问题后再考虑重新添加或用其他方式实现阴影。

修改后的XML:

<de.hdodenhof.circleimageview.CircleImageView 
    android:layout_marginLeft="@dimen/dim_5" 
    android:id="@+id/imgNavDp" 
    android:layout_width="@dimen/dim_76" 
    android:layout_height="@dimen/dim_76" 
    android:layout_gravity="center_vertical" />

4. 自定义Glide Target控制加载流程

如果以上方法都不行,可以通过自定义Target来确保图片完全加载后再交给CircleImageView,避免中间状态的渲染错误:

Glide.with(act)
    .load(userdata.image)
    .placeholder(R.drawable.ic_male)
    .into(object : GlideDrawableImageViewTarget(headerView.imgNavDp) {
        override fun onResourceReady(resource: GlideDrawable?, animation: GlideAnimation<in GlideDrawable>?) {
            // 确保资源就绪后再设置给CircleImageView
            headerView.imgNavDp.setImageDrawable(resource)
        }
    })

一般来说,升级Glide版本就能解决大部分这类兼容性问题,建议优先尝试这个方案。

内容的提问来源于stack exchange,提问作者Yogesh Choudhary Paliyal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:44:47