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
相关产品推荐
相关产品推荐

