Cuando actualizamos el adaptador en Recyclerview, si la imagen con esquinas redondeadas se carga en el elemento, parpadeará.
La carga de Glide que utilicé aquí se basa en la introducción del sitio web oficial de Glide,
por lo que debemos reescribir estos tres métodos
public class BTransformation extends BitmapTransformation {
private static final String ID = "com.demo.mvp_demo.hilt.BTransformation";
private static final byte[] ID_BYTES = ID.getBytes(CHARSET);
private float radius;
public BTransformation(int radius) {
this.radius = radius;
}
@Override
protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {
return cornersImage(pool, toTransform);
}
//重写三方法 使得磁盘和缓存 正常工作
@Override
public boolean equals(@Nullable Object obj) {
return obj instanceof BTransformation;
}
@Override
public int hashCode() {
return ID.hashCode();
}
@Override
public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {
messageDigest.update(ID_BYTES);
}
//画圆角
private Bitmap cornersImage(BitmapPool pool, Bitmap bitmapSource) {
Bitmap tempBitmap = null;
try {
if (bitmapSource == null) {
return null;
}
tempBitmap = pool.get(bitmapSource.getWidth(), bitmapSource.getHeight(),
Bitmap.Config.ARGB_8888);
if (tempBitmap == null) {
tempBitmap = Bitmap.createBitmap(bitmapSource.getWidth(),
bitmapSource.getHeight(), Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(tempBitmap);
Paint paint = new Paint();
paint.setShader(new BitmapShader(bitmapSource, BitmapShader.TileMode.CLAMP,
BitmapShader.TileMode.CLAMP));
paint.setAntiAlias(true);
RectF rectF = new RectF(0f, 0f, bitmapSource.getWidth(),
bitmapSource.getHeight());
canvas.drawRoundRect(rectF, radius, radius, paint);
} catch (Exception e) {
e.printStackTrace();
}
return tempBitmap;
}
//画圆
private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
if (source == null) return null;
//获取资源的长宽,获取最小值 子位图的像素个数
int size = Math.min(source.getWidth(), source.getHeight());
// 子位图第一个像素在源位图的X坐标
int x = (source.getWidth() - size) / 2;
//子位图第一个像素在源位图的y坐标
int y = (source.getHeight() - size) / 2;
//创建新位图 source 源位图
Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
//返回一个正好匹配给定宽、高和配置的只包含透明像素的Bitmap
// 如果BitmapPool中找不到这样的Bitmap,就返回null
Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
//当返回null 时,创建给定宽、高和配置的新位图
if (result == null) {
result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
}
//画图
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
// 设置shader
paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
//抗锯齿
paint.setAntiAlias(true);
float r = size / 2f;
// 用设置好的画笔绘制一个圆
canvas.drawCircle(r, r, r, paint);
return result;
}
}
De esta forma, el disco y la memoria hacen que funcione correctamente.
Actividad
int radius = 30;
RequestOptions options = new RequestOptions().transform(new BTransformation(radius));
Glide.with(this).load(url).apply(options).into(iv_main_img);
Si las esquinas redondeadas implementadas de forma predeterminada aquí deben redondearse, debe reemplazar el método en la transformación con el método circleCrop para lograrlo. Utilice el método circlecrop para eliminar el método de construcción sin pasar el radio. Porque no necesita para utilizar las esquinas redondeadas, es necesario construir la pasada. Parámetro radio
Grabe aquí