下面我将详细讲解“Android将Glide动态加载不同大小的图片切圆角与圆形的方法”的完整攻略。
何为Glide
Glide是一个用于在Android中加载图像、视频以及gif动画等媒体资源的快速轻量级库。Glide库使用简单,可缩短开发时间并有效地减少Out Of Memory异常的发生。同时,Glide操作图片的速度比Picasso或Fresco要慢,且支持纹理压缩、解码WebP格式、图片变换、动画、磁盘缓存等。
在Glide中实现圆角与圆形图片
原理
从本质上讲,Glide需要将加载的图片裁剪为圆角或圆形。为了实现这一点,我们需要借助于Glide的一个功能——Transformation。此类用于转换 Bitmap 数据以供 Glide 使用。它是一种可组合的转换,即可以对 Bitmap 进行一系列转换操作后,又可进行变换、加载到 View 中。我们可以通过实现Transformation来实现图片的圆角或圆形裁剪。
实现步骤
步骤一:引入Glide库
在build.gradle文件中添加以下代码,引入Glide库:
dependencies {
implementation 'com.github.bumptech.glide:glide:4.11.0'
}
步骤二:自定义Transformation
自定义Transformation需要实现com.bumptech.glide.load.resource.bitmap.Transformation接口。这个接口只有一个方法transform(Bitmap source, int outWidth, int outHeight),用于对图片进行变换,返回一个新的Bitmap。
我们需要在transform()方法中完成图片的圆角或圆形处理操作,然后返回处理后的Bitmap。代码示例如下:
public class RoundTransformation implements Transformation<Bitmap> {
private static final String ID = "com.example.app.RoundTransformation";
private static final byte[] ID_BYTES = ID.getBytes(Charset.forName("UTF-8"));
private float radius;
private boolean isCircle;
public RoundTransformation(float radius, boolean isCircle) {
this.radius = radius;
this.isCircle = isCircle;
}
@Override
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
Bitmap source = resource.get();
Bitmap bitmap;
if (isCircle) {
bitmap = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
paint.setAntiAlias(true);
int minSize = Math.min(source.getWidth(), source.getHeight());
canvas.drawCircle(minSize / 2f, minSize / 2f, minSize / 2f, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(source, 0, 0, paint);
if (source != bitmap) {
source.recycle();
}
} else {
bitmap = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
paint.setAntiAlias(true);
RectF rectF = new RectF(0, 0, source.getWidth(), source.getHeight());
canvas.drawRoundRect(rectF, radius, radius, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(source, 0, 0, paint);
if (source != bitmap) {
source.recycle();
}
}
return Resource.obtain(bitmap, Glide.get(context).getBitmapPool());
}
@Override
public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {
messageDigest.update(ID_BYTES);
}
}
步骤三:使用自定义Transformation
完成自定义Transformation后,我们可以使用它将Glide加载的图片裁剪为圆角或圆形,代码示例如下:
Glide.with(context)
.load(url)
.apply(RequestOptions.bitmapTransform(new RoundTransformation(radius, isCircle)))
.into(imageView);
这里我们将自定义Transformation传递给RequestOptions.bitmapTransform()方法即可进行参数的设置和图片的加载,在加载时即可实现圆角或圆形裁剪。
示例
示例一:加载圆形图片
以下代码将通过自定义的RoundTransformation来加载一张圆形的图片。
Glide.with(context)
.load(url)
.apply(RequestOptions.bitmapTransform(new RoundTransformation(-1, true)))
.into(imageView);
这里我们将圆角半径设置为-1(即表示不需要圆角)并将isCircle设置为true,实现了圆形的裁剪。
示例二:加载圆角图片
以下代码将通过自定义的RoundTransformation来加载一张圆角的图片,圆角半径为40。
Glide.with(context)
.load(url)
.apply(RequestOptions.bitmapTransform(new RoundTransformation(40, false)))
.into(imageView);
这里我们将圆角半径设置为40,并将isCircle设置为false,实现了圆角的裁剪。
总结
以上就是如何使用Glide实现圆角和圆形图片的方法,主要包括引入Glide库、自定义Transformation和使用自定义Transformation三个步骤。其中自定义Transformation是关键部分,我们需要在其中完成图片的圆角或圆形裁剪操作,并将新的Bitmap返回。另外,通过两个示例代码也能让我们更好地理解该方法的具体实现。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android将Glide动态加载不同大小的图片切圆角与圆形的方法 - Python技术站