使用Glide拉伸图片以适配ImageView的实现方法
解决Glide加载图片铺满ImageView且完整显示的问题
嗨,这个问题我之前也碰到过,核心就是要实现和设置background一样的效果——拉伸铺满整个ImageView,同时不裁剪、完整显示图片,下面给你两种实用的解决方案:
方案一:利用ImageView的ScaleType(最简单直接)
这是最贴近你需求的方法,原理和设置background完全一致:
- 在XML中配置ImageView的拉伸属性
给你的ImageView添加android:scaleType="fitXY",这个属性会强制图片拉伸至匹配ImageView的宽高,完全铺满且不会裁剪任何部分:
<ImageView android:id="@+id/target_image_view" android:layout_width="match_parent" android:layout_height="250dp" android:scaleType="fitXY" />
- 用Glide正常加载图片
不需要额外的变换设置,直接加载即可,ImageView的fitXY会自动处理拉伸逻辑:
// Java示例 Glide.with(this) .load("你的图片URL/本地路径") .into(target_image_view);
// Kotlin示例 Glide.with(this) .load("你的图片URL/本地路径") .into(target_image_view)
方案二:自定义Glide Transformation(更灵活)
如果不想修改ImageView的默认ScaleType,或者需要更定制化的拉伸逻辑,可以自定义一个变换类来实现:
- 创建拉伸变换类
这个类会将图片直接拉伸至目标ImageView的尺寸:
public class StretchTransformation extends BitmapTransformation { private int targetWidth; private int targetHeight; public StretchTransformation(int targetWidth, int targetHeight) { this.targetWidth = targetWidth; this.targetHeight = targetHeight; } @Override protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) { // 直接将图片拉伸至目标尺寸 return Bitmap.createScaledBitmap(toTransform, targetWidth, targetHeight, true); } @Override public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) { messageDigest.update(("stretch_" + targetWidth + "_" + targetHeight).getBytes(StandardCharsets.UTF_8)); } }
- 加载时应用自定义变换
注意要确保View已经完成测量(避免拿到宽高为0的情况),所以用post()方法来触发加载:
// Java示例 target_image_view.post(() -> { int viewWidth = target_image_view.getWidth(); int viewHeight = target_image_view.getHeight(); Glide.with(this) .load("你的图片URL/本地路径") .transform(new StretchTransformation(viewWidth, viewHeight)) .into(target_image_view); });
小提醒
- 方案一中的
fitXY会改变图片原始比例,这和设置background的效果完全一致,如果你的图片和ImageView比例差异较大,会出现变形,这是符合你需求的正常现象。 - 方案二中一定要在View布局完成后获取宽高,否则会导致拉伸失效。
内容的提问来源于stack exchange,提问作者Ashuthosh Patoa
相关产品推荐
相关产品推荐

