关于 Glide 加载图片圆角问题

本文介绍使用Glide加载图片时遇到的问题:设置矩形圆角但图片未能正确显示。文章详细解释了centerCrop方法与transform方法冲突的原因,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用 Glide 加载图片是,当我们在显示一张图片的时候,想让他等比例缩放到ImageView的大小,又想这张图片实现矩形圆角,我们的常规的写法就是:

Glide.with(context)
    .load(url)
    .transform(new GlideCircleTransform(context))
    .centerCrop()
    .diskCacheStrategy(DiskCacheStrategy.ALL)
    .crossFade()
    .into(view);
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

但是这样在项目中出现的效果却是这样的:

这里写图片描述

你会发现,咦?我的圆角呢?我代码明明设置了啊。难道我写的是假代码?
那么,我们去掉 centerCrop() 再看看:

这里写图片描述

现在圆角是有了,但是图片明显却没有撑满了。

原因到底是什么呢? 其实主要问题是在 centerCrop()方法里面。
看centerCrop()方法的源码可知,也是需要调用transform()方法的.所以前后共用CenterCrop会覆盖掉GlideRoundImage的效果:

public BitmapRequestBuilder<ModelType, TranscodeType> centerCrop() {
        return transform(glide.getBitmapCenterCrop());
    }
  
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

那么我们要怎么去解决呢? 方法如下:

Glide.with(context)
    .load(url)
    .transform(new CenterCrop(context), new GlideRoundTransform(context))
    .diskCacheStrategy(DiskCacheStrategy.ALL)
    .crossFade()
    .into(view);
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2个效果同时放在transform里面就可以了,效果图

这里写图片描述

转自:http://blog.youkuaiyun.com/Alpha58/article/details/56835558

<think>好的,用户想用Glide在Android中加载圆角图片,我需要给出具体的步骤和示例代码。首先,我得回忆一下Glide的基本用法,然后思考如何实现圆角效果。记得Glide可以通过Transformations来修改图片,比如应用圆角变换。 首先,用户可能需要自定义一个Transformation类。我应该检查是否有现成的类可以使用,比如RoundedCornersTransformation,或者是否需要自己实现BitmapTransformation。另外,Glide的版本不同,方法可能有所变化,比如是否使用RequestOptions还是通过apply方法。 接下来,要考虑如何将圆角应用到图片上。可能需要使用Bitmap的Canvas和Paint来绘制圆角矩形,然后裁剪图片。同时要注意处理不同的图片尺寸和宽高比,确保圆角正确应用,避免变形。 然后,权限方面,用户可能需要网络和存储权限,但用户的问题是关于圆角图片的,可能已经配置好了。不过示例中的manifest引用可能有相关的权限设置,需要确认是否需要提及,但用户的问题可能不需要这部分,所以可能不需要展开。 示例代码部分,需要展示如何加载图片并应用圆角。比如使用Glide.with(context).load(url).apply(requestOptions).into(imageView)。其中,RequestOptions需要包含圆角变换。如果使用第三方库如glide-transformations,可能需要添加依赖,并展示如何集成。 另外,是否需要处理不同的圆角半径,比如四个角不同的半径,或者统一设置。用户可能希望四个角都是圆角,所以示例中使用统一的半径,比如10dp。 最后,要检查代码的正确性,确保导入正确的类,比如RoundedCorners或者自定义的Transformation。同时,提醒用户添加必要的依赖,如果使用第三方库的话。 总结步骤应该是:添加依赖(如果需要)、创建圆角Transformation、应用RequestOptions、加载图片。同时,给出两种方法:使用内置方法和第三方库,可能更全面。比如Glide 4.x之后支持RoundedCorners,而旧版本可能需要自定义或者第三方库。 需要确保示例代码中的context、url和imageView变量是用户能够替换的,并且语法正确,比如使用apply和transform方法。另外,圆角的单位可能需要转换为像素,或者使用dp,所以可能需要上下文来获取资源,但示例中可能简化处理,直接使用像素值。 最后,生成相关问题,比如性能优化、其他变换、态调整圆角等,帮助用户进一步了解。</think>在Android中使用Glide加载圆角图片,可以通过`Transformation`实现形处理。以下是两种实现方式及示例代码: --- ### 方法1:使用内置RoundedCorners(Glide 4.x及以上) ```java // 创建RequestOptions设置圆角半径(单位为像素) RequestOptions options = new RequestOptions() .transform(new RoundedCorners(20)); // 20px圆角 Glide.with(context) .load("https://example.com/image.jpg") .apply(options) .into(imageView); ``` --- ### 方法2:自定义BitmapTransformation(兼容旧版本) ```java public class RoundCornerTransform extends BitmapTransformation { private final float radius; public RoundCornerTransform(Context context, int radiusDp) { this.radius = TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, radiusDp, context.getResources().getDisplayMetrics() ); } @Override protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) { Bitmap result = pool.get(toTransform.getWidth(), toTransform.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(result); Paint paint = new Paint(); paint.setAntiAlias(true); paint.setShader(new BitmapShader(toTransform, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)); RectF rectF = new RectF(0f, 0f, toTransform.getWidth(), toTransform.getHeight()); canvas.drawRoundRect(rectF, radius, radius, paint); return result; } @Override public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) { messageDigest.update(("RoundCorner(radius=" + radius + ")").getBytes()); } } // 使用自定义Transform RequestOptions options = new RequestOptions() .transform(new RoundCornerTransform(context, 10)); // 10dp圆角 Glide.with(context) .load("url") .apply(options) .into(imageView); ``` --- ### 关键点说明 1. **形处理原理**:通过`BitmapShader`将原始图片作为纹理填充到圆角矩形区域 2. **性能优化**:建议复用`BitmapPool`管理内存[^2] 3. **注意事项**:圆角半径单位需根据场景选择像素(px)或dp --- ### 扩展建议 若需要更复杂的形处理(如不对称圆角),推荐使用第三方库`glide-transformations`: ```gradle implementation 'jp.wasabeef:glide-transformations:4.3.0' ``` 使用示例: ```java Glide.with(context) .load("url") .apply(RequestOptions.bitmapTransform( new RoundedCornersTransformation(15, 0, RoundedCornersTransformation.CornerType.ALL))) .into(imageView); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值