这是因为没有复写
equals()
hashCode()
updateDiskCacheKey
必需的方法
请特别注意,对于任何 Transformation
子类,包括 BitmapTransformation
,你都有三个方法你 必须 实现它们,以使得磁盘和内存缓存正确地工作:
equals()
hashCode()
updateDiskCacheKey
如果你的 Transformation
没有参数,通常使用一个包含完整包限定名的 static
final
String
来作为一个 ID,它可以构成 hashCode()
的基础,并可用于更新 updateDiskCacheKey()
传入的 MessageDigest
。如果你的 Transformation
需要参数而且它会影响到 Bitmap
被变换的方式,它们也必须被包含到这三个方法中。
例如,Glide 的 RoundedCorners
变换接受一个 int
,它决定了圆角的弧度。它的equals()
, hashCode()
和 updateDiskCacheKey
实现看起来像这样:
@Override
public boolean equals(Object o) {
if (o instanceof RoundedCorners) {
RoundedCorners other = (RoundedCorners) o;
return roundingRadius == other.roundingRadius;
}
return false;
}
@Override
public int hashCode() {
return Util.hashCode(ID.hashCode(),
Util.hashCode(roundingRadius));
}
@Override
public void updateDiskCacheKey(MessageDigest messageDigest) {
messageDigest.update(ID_BYTES);
byte[] radiusData = ByteBuffer.allocate(4).putInt(roundingRadius).array();
messageDigest.update(radiusData);
}
原来的 String
仍然保留,但 roundingRadius
被包含到了三个方法中。这里,updateDiskCacheKey
方法还演示了你可以如何使用 ByteBuffer
来包含基本参数到你的 updateDiskCacheKey
实现中。
官方文档:https://muyangmin.github.io/glide-docs-cn/doc/transformations.html
/**
* description:自定义图片转圆形类
*/
public class GlideCircleTransform extends BitmapTransformation {
private static final String ID = "com.bumptech.glide.transformations.GlideCircleTransform";
private final byte[] ID_ByTES= ID.getBytes(CHARSET);
@Override
protected Bitmap transform(@NotNull BitmapPool pool, @NotNull Bitmap toTransform, int outWidth, int outHeight) {
return circleCrop(pool, toTransform);
}
private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
if (source == null) {
return null;
}
int size = Math.min(source.getWidth(), source.getHeight());
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
if (result == null) {
result = pool.get(size, size, Bitmap.Config.RGB_565);
}
// Bitmap result = pool.get(size, size, Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
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;
}
@Override
public boolean equals(Object o) {
return o instanceof GlideCircleTransform;
}
@Override
public int hashCode() {
return ID.hashCode();
}
@Override
public void updateDiskCacheKey(MessageDigest messageDigest) {
messageDigest.update(ID_ByTES);
}
}
/**
* description:自定义Glide圆角图片类 将图像转换为四个角有弧度的图像
*/
public class GlideRoundTransform extends BitmapTransformation {
private final float radius;
private final String ID = "com. bumptech.glide.transformations.GlideRoundTransform";
private final byte[] ID_ByTES = ID.getBytes(CHARSET);
public GlideRoundTransform(int dp) {
this.radius = Resources.getSystem().getDisplayMetrics().density * dp;
}
@Override
protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {
return roundCrop(pool, toTransform);
}
private Bitmap roundCrop(BitmapPool pool, Bitmap toTransform) {
if (toTransform == null) {
return null;
}
Bitmap result = pool.get(toTransform.getWidth(), toTransform.getHeight(), Bitmap.Config.ARGB_8888);
if (result == null) {
return Bitmap.createBitmap(toTransform.getWidth(), toTransform.getHeight(), Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(result);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setShader(new BitmapShader(toTransform, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
RectF rectF = new RectF(0f, 0f, toTransform.getWidth(), toTransform.getHeight());
canvas.drawRoundRect(rectF, radius, radius, paint);
return result;
}
@Override
public boolean equals(Object o) {
if (o instanceof GlideRoundTransform) {
GlideRoundTransform other = (GlideRoundTransform) o;
return radius == other.radius;
}
return false;
}
@Override
public int hashCode() {
return Util.hashCode(ID.hashCode(),
Util.hashCode(radius));
}
@Override
public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {
messageDigest.update(ID_ByTES);
byte[] radiusData = ByteBuffer.allocate(4).putInt((int) radius).array();
messageDigest.update(radiusData);
}
}
或者直接使用 glide-transformations