android Glide某1-2张图出现尺寸比较小,而其他是充满的。
图片imageView控件的布局为:
没有什么特殊的。而尝试了Glide RequestOptions 如下几种case。
switch (i) {
case 1:
option1 =
RequestOptions.bitmapTransform(new MultiTransformation<>(new CenterCrop(),
new RoundedCorners(12)))
;
options2 =
RequestOptions.bitmapTransform(new MultiTransformation<>(new CenterCrop(),
new RoundedCorners(8)))
;
options3 =
RequestOptions.bitmapTransform(new MultiTransformation<>(new CenterCrop(),
new RoundedCorners(8)));
options4 =
RequestOptions.bitmapTransform(new MultiTransformation<>(new CenterCrop(),
new RoundedCorners(8))).centerCrop();
break;
case 2:
option1 =
RequestOptions.bitmapTransform(new GlideRoundTransform(12, 0));
options2 =
RequestOptions.bitmapTransform(new GlideRoundTransform(8, 0));
options3 =
RequestOptions.bitmapTransform(new GlideRoundTransform(8, 0));
options4 =
RequestOptions.bitmapTransform(new GlideRoundTransform(8, 0));
break;
case 3:
option1 =
RequestOptions.bitmapTransform(new GlideRoundTransform(12, 0))
.override(284, 152);
options2 =
RequestOptions.bitmapTransform(new GlideRoundTransform(8, 0))
.override(246, 346);
options3 =
RequestOptions.bitmapTransform(new GlideRoundTransform(8, 0))
.override(372, 208);
options4 =
RequestOptions.bitmapTransform(new GlideRoundTransform(8, 0))
.override(372, 208);
break;
case 4:
option1 =
new RequestOptions().override(284, 152)
.transform(new GlideRoundTransform(12, 0));
options2 =
new RequestOptions().override(246, 346)
.transform(new GlideRoundTransform(8, 0));
options3 =
new RequestOptions().override(372, 208).
transform(new GlideRoundTransform(8, 0));
options4 =
new RequestOptions().override(372, 208).
transform(new GlideRoundTransform(8, 0));
break;
case 5:
option1 =
new RequestOptions().override(284, 152)
.transform(new MultiTransformation<>(new CenterCrop(),
new RoundedCorners(12)));
options2 =
new RequestOptions().override(246, 346)
.transform(new MultiTransformation<>(new CenterCrop(),
new RoundedCorners(8)));
options3 =
new RequestOptions().override(372, 208)
.transform(new MultiTransformation<>(new CenterCrop(),
new RoundedCorners(8)));
options4 =
new RequestOptions().override(372, 208)
.transform(new MultiTransformation<>(new CenterCrop(),
new RoundedCorners(8)));
break;
default:
option1 =
RequestOptions.bitmapTransform(new MultiTransformation<>(new CenterCrop(),
new RoundedCorners(12)))
.override(284, 152);
options2 =
RequestOptions.bitmapTransform(new MultiTransformation<>(new CenterCrop(),
new RoundedCorners(8)))
.override(246, 346);
options3 =
RequestOptions.bitmapTransform(new MultiTransformation<>(new CenterCrop(),
new RoundedCorners(8)))
.override(372, 208);
options4 =
RequestOptions.bitmapTransform(new MultiTransformation<>(new CenterCrop(),
new RoundedCorners(8)))
.override(372, 208);
break;
}
共计尝试了如上共计6种case的。
最后得出结论,2,3,4是稳定的不会出现小图了。
跟机型和版本有关系,glide4.8.具体有空还需要继续研究。目前满足使用。
附录代码:
public class GlideRoundTransform extends BitmapTransformation {
private static final int VERSION = 1;
private static final String ID = "jp.wasabeef.glide.transformations.RoundedCornersTransformation." + VERSION;
public enum CornerType {
ALL,
TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT,
TOP, BOTTOM, LEFT, RIGHT,
OTHER_TOP_LEFT, OTHER_TOP_RIGHT, OTHER_BOTTOM_LEFT, OTHER_BOTTOM_RIGHT,
DIAGONAL_FROM_TOP_LEFT, DIAGONAL_FROM_TOP_RIGHT
}
private int radius;
private int diameter;
private int margin;
private CornerType cornerType;
private int bgColor;
public GlideRoundTransform(int radius, int margin) {
this(radius, margin, CornerType.ALL);
}
public GlideRoundTransform(int radius, int margin, CornerType cornerType) {
this.radius = radius;
this.diameter = this.radius * 2;
this.margin = margin;
this.cornerType = cornerType;
}
@Override
protected Bitmap transform(@NonNull BitmapPool pool,
@NonNull Bitmap toTransform, int outWidth, int outHeight) {
Bitmap tmp = TransformationUtils.centerCrop(pool, toTransform, outWidth, outHeight);
int width = tmp.getWidth();
int height = tmp.getHeight();
Bitmap bitmap = pool.get(width, height, Bitmap.Config.ARGB_4444);
bitmap.setHasAlpha(true);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
paint.setAntiAlias(true);
if(bgColor != 0) {
paint.setColor(bgColor);
paint.setStyle(Paint.Style.FILL);
RectF rectBg = new RectF(0, 0, canvas.getWidth() - radius, canvas.getHeight() - radius);
canvas.drawRoundRect(rectBg, radius, radius, paint);
}
paint.setShader(new BitmapShader(tmp, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
drawRoundRect(canvas, paint, width, height);
return bitmap;
}
private void drawRoundRect(Canvas canvas, Paint paint, float width, float height) {
float right = width - margin;
float bottom = height - margin;
switch (cornerType) {
case ALL:
canvas.drawRoundRect(new RectF(margin, margin, right, bottom), radius, radius, paint);
break;
case TOP_LEFT:
drawTopLeftRoundRect(canvas, paint, right, bottom);
break;
case TOP_RIGHT:
drawTopRightRoundRect(canvas, paint, right, bottom);
break;
case BOTTOM_LEFT:
drawBottomLeftRoundRect(canvas, paint, right, bottom);
break;
case BOTTOM_RIGHT:
drawBottomRightRoundRect(canvas, paint, right, bottom);
break;
case TOP:
drawTopRoundRect(canvas, paint, right, bottom);
break;
case BOTTOM:
drawBottomRoundRect(canvas, paint, right, bottom);
break;
case LEFT:
drawLeftRoundRect(canvas, paint, right, bottom);
break;
case RIGHT:
drawRightRoundRect(canvas, paint, right, bottom);
break;
case OTHER_TOP_LEFT:
drawOtherTopLeftRoundRect(canvas, paint, right, bottom);
break;
case OTHER_TOP_RIGHT:
drawOtherTopRightRoundRect(canvas, paint, right, bottom);
break;
case OTHER_BOTTOM_LEFT:
drawOtherBottomLeftRoundRect(canvas, paint, right, bottom);
break;
case OTHER_BOTTOM_RIGHT:
drawOtherBottomRightRoundRect(canvas, paint, right, bottom);
break;
case DIAGONAL_FROM_TOP_LEFT:
drawDiagonalFromTopLeftRoundRect(canvas, paint, right, bottom);
break;
case DIAGONAL_FROM_TOP_RIGHT:
drawDiagonalFromTopRightRoundRect(canvas, paint, right, bottom);
break;
default:
canvas.drawRoundRect(new RectF(margin, margin, right, bottom), radius, radius, paint);
break;
}
}
private void drawTopLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(margin, margin, margin + diameter, margin + diameter), radius,
radius, paint);
canvas.drawRect(new RectF(margin, margin + radius, margin + radius, bottom), paint);
canvas.drawRect(new RectF(margin + radius, margin, right, bottom), paint);
}
private void drawTopRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(right - diameter, margin, right, margin + diameter), radius,
radius, paint);
canvas.drawRect(new RectF(margin, margin, right - radius, bottom), paint);
canvas.drawRect(new RectF(right - radius, margin + radius, right, bottom), paint);
}
private void drawBottomLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(margin, bottom - diameter, margin + diameter, bottom), radius,
radius, paint);
canvas.drawRect(new RectF(margin, margin, margin + diameter, bottom - radius), paint);
canvas.drawRect(new RectF(margin + radius, margin, right, bottom), paint);
}
private void drawBottomRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(right - diameter, bottom - diameter, right, bottom), radius,
radius, paint);
canvas.drawRect(new RectF(margin, margin, right - radius, bottom), paint);
canvas.drawRect(new RectF(right - radius, margin, right, bottom - radius), paint);
}
private void drawTopRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(margin, margin, right, margin + diameter), radius, radius,
paint);
canvas.drawRect(new RectF(margin, margin + radius, right, bottom), paint);
}
private void drawBottomRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(margin, bottom - diameter, right, bottom), radius, radius,
paint);
canvas.drawRect(new RectF(margin, margin, right, bottom - radius), paint);
}
private void drawLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(margin, margin, margin + diameter, bottom), radius, radius,
paint);
canvas.drawRect(new RectF(margin + radius, margin, right, bottom), paint);
}
private void drawRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(right - diameter, margin, right, bottom), radius, radius, paint);
canvas.drawRect(new RectF(margin, margin, right - radius, bottom), paint);
}
private void drawOtherTopLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(margin, bottom - diameter, right, bottom), radius, radius,
paint);
canvas.drawRoundRect(new RectF(right - diameter, margin, right, bottom), radius, radius, paint);
canvas.drawRect(new RectF(margin, margin, right - radius, bottom - radius), paint);
}
private void drawOtherTopRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(margin, margin, margin + diameter, bottom), radius, radius,
paint);
canvas.drawRoundRect(new RectF(margin, bottom - diameter, right, bottom), radius, radius,
paint);
canvas.drawRect(new RectF(margin + radius, margin, right, bottom - radius), paint);
}
private void drawOtherBottomLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) {
canvas.drawRoundRect(new RectF(margin, margin, right, margin + diameter), radius, radius,
paint);
canvas.drawRoundRect(new RectF(right - diameter, margin, right, bottom), radius, radius, paint);
canvas.drawRect(new RectF(margin, margin + radius, right - radius, bottom), paint);
}
private void drawOtherBottomRightRoundRect(Canvas canvas, Paint paint, float right,
float bottom) {
canvas.drawRoundRect(new RectF(margin, margin, right, margin + diameter), radius, radius,
paint);
canvas.drawRoundRect(new RectF(margin, margin, margin + diameter, bottom), radius, radius,
paint);
canvas.drawRect(new RectF(margin + radius, margin + radius, right, bottom), paint);
}
private void drawDiagonalFromTopLeftRoundRect(Canvas canvas, Paint paint, float right,
float bottom) {
canvas.drawRoundRect(new RectF(margin, margin, margin + diameter, margin + diameter), radius,
radius, paint);
canvas.drawRoundRect(new RectF(right - diameter, bottom - diameter, right, bottom), radius,
radius, paint);
canvas.drawRect(new RectF(margin, margin + radius, right - diameter, bottom), paint);
canvas.drawRect(new RectF(margin + diameter, margin, right, bottom - radius), paint);
}
private void drawDiagonalFromTopRightRoundRect(Canvas canvas, Paint paint, float right,
float bottom) {
canvas.drawRoundRect(new RectF(right - diameter, margin, right, margin + diameter), radius,
radius, paint);
canvas.drawRoundRect(new RectF(margin, bottom - diameter, margin + diameter, bottom), radius,
radius, paint);
canvas.drawRect(new RectF(margin, margin, right - radius, bottom - radius), paint);
canvas.drawRect(new RectF(margin + radius, margin + radius, right, bottom), paint);
}
@Override
public String toString() {
return "RoundedTransformation(radius=" + radius + ", margin=" + margin + ", diameter="
+ diameter + ", cornerType=" + cornerType.name() + ")";
}
@Override
public boolean equals(Object o) {
return o instanceof GlideRoundTransform &&
((GlideRoundTransform) o).radius == radius &&
((GlideRoundTransform) o).diameter == diameter &&
((GlideRoundTransform) o).margin == margin &&
((GlideRoundTransform) o).cornerType == cornerType;
}
@Override
public int hashCode() {
return ID.hashCode() + radius * 10000 + diameter * 1000 + margin * 100 + cornerType.ordinal() * 10;
}
@Override
public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {
try {
messageDigest.update((ID + radius + diameter + margin + cornerType).getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
/**
* 设置图片底部的颜色值
*/
public void setBgColor(int bgColor){
this.bgColor = bgColor;
}
}