Glide有2种获取图片宽高的方式:
通过添加 RequestListener 并设置 override(Target.SIZE_ORIGINAL),可以在图片解码前获取其原始尺寸信息。
Glide.with(context)
.asBitmap()
.load(R.drawable.your_image) // 或 Uri、URL、文件路径
.override(Target.SIZE_ORIGINAL) // 请求原始尺寸
.addListener(object : RequestListener<Bitmap> {
override fun onResourceReady(
resource: Bitmap?,
model: Any?,
target: Target<Bitmap>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
resource?.let {
val width = it.width
val height = it.height
// 在此处处理获取到的宽高
Log.d("GlideSize", "Width: $width, Height: $height")
}
return true // 返回 true 阻止图片传递给 ImageView
}
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<Bitmap>?,
isFirstResource: Boolean
): Boolean {
return false
}
})
.preload() // 仅预加载,不显示
第二种方式:
通过 SimpleTarget 的回调获取尺寸后立即释放资源,避免内存占用
Glide.with(context.applicationContext) // 使用 ApplicationContext 避免生命周期问题
.asBitmap()
.load(R.drawable.your_image)
.into(object : SimpleTarget<Bitmap>() {
override fun onResourceReady(
resource: Bitmap,
transition: Transition<in Bitmap>?
) {
val width = resource.width
val height = resource.height
// 处理获取到的宽高
resource.recycle() // 获取尺寸后立即回收 Bitmap
}
})
- 性能优化 :方法一通过
override(Target.SIZE_ORIGINAL)和preload()组合,能最大程度减少内存使用,仅解码图片头部信息获取尺寸1。 - 生命周期管理 :如果仅需获取尺寸而不涉及 UI 更新,建议使用
ApplicationContext以避免内存泄漏2。 - 网络图片:对于网络图片,Glide 会先下载图片头部信息来获取尺寸,不会下载完整图片数据1。
- 回调处理:两种方法均为异步操作,获取到的宽高需在回调中处理。
根据上篇文章的思想继续优化:
private fun loadImageToView(
context: Context,
maxWidth: Int,
maxHeight: Int,
resId: Int,
igvTarget: ImageView
) {
Glide.with(context)
.asBitmap()
.load(resId) // 或 Uri、URL、文件路径
.override(Target.SIZE_ORIGINAL) // 请求原始尺寸
.addListener(object : RequestListener<Bitmap> {
override fun onResourceReady(
resource: Bitmap,
model: Any,
target: com.bumptech.glide.request.target.Target<Bitmap>,
dataSource: DataSource,
isFirstResource: Boolean
): Boolean {
resource?.let {
val width = it.width
val height = it.height
// 在此处处理获取到的宽高
Log.d("GlideSize", "Width: $width, Height: $height")
val scaleResult =
ImageUtils.calculateScaleParameters(
maxWidth,
maxHeight,
width,
height
)
runOnUiThread {
igvTarget.layoutParams.height = scaleResult.newHeight
igvTarget.layoutParams.width = scaleResult.newWidth
Glide.with(context).load(resId).into(igvTarget)
}
}
return true // 返回 true 阻止图片传递给 ImageView
}
override fun onLoadFailed(
e: GlideException?,
model: Any,
target: com.bumptech.glide.request.target.Target<Bitmap>,
isFirstResource: Boolean
): Boolean {
return false
}
})
.preload() // 仅预加载,不显示
}
private fun loadImageToView(
context: Context,
maxWidth: Int,
maxHeight: Int,
path: String,
igvTarget: ImageView
) {
Glide.with(context)
.asBitmap()
.load(path) // 或 Uri、URL、文件路径
.override(Target.SIZE_ORIGINAL) // 请求原始尺寸
.addListener(object : RequestListener<Bitmap> {
override fun onResourceReady(
resource: Bitmap,
model: Any,
target: com.bumptech.glide.request.target.Target<Bitmap>,
dataSource: DataSource,
isFirstResource: Boolean
): Boolean {
resource?.let {
val width = it.width
val height = it.height
// 在此处处理获取到的宽高
Log.d("GlideSize", "Width: $width, Height: $height")
val scaleResult =
ImageUtils.calculateScaleParameters(
maxWidth,
maxHeight,
width,
height
)
runOnUiThread {
igvTarget.layoutParams.height = scaleResult.newHeight
igvTarget.layoutParams.width = scaleResult.newWidth
Glide.with(context).load(path).into(igvTarget)
}
}
return true // 返回 true 阻止图片传递给 ImageView
}
override fun onLoadFailed(
e: GlideException?,
model: Any,
target: com.bumptech.glide.request.target.Target<Bitmap>,
isFirstResource: Boolean
): Boolean {
return false
}
})
.preload() // 仅预加载,不显示
}