diff --git a/foudations/mogo-utils/src/main/java/com/mogo/utils/glide/GlideBlurTransformation.java b/foudations/mogo-utils/src/main/java/com/mogo/utils/glide/GlideBlurTransformation.java index 41f1db3614..d8f753a4c9 100644 --- a/foudations/mogo-utils/src/main/java/com/mogo/utils/glide/GlideBlurTransformation.java +++ b/foudations/mogo-utils/src/main/java/com/mogo/utils/glide/GlideBlurTransformation.java @@ -15,7 +15,7 @@ import com.bumptech.glide.load.resource.bitmap.CenterCrop; /** * 使用Glide加载图片时,使该图片进行高斯模糊 * 基本用法:Glide.with(this).load(userInfo.headImgurl).apply(RequestOptions.bitmapTransform(GlideBlurTransformation(this))).into(ivCardBg) - * + * 如果想用多个Transform可以使用{@link com.bumptech.glide.load.MultiTransformation} 进行Transform的融合 * @author tongchenfei */ public class GlideBlurTransformation extends CenterCrop { diff --git a/foudations/mogo-utils/src/main/java/com/mogo/utils/glide/GlideRoundedCornersTransform.java b/foudations/mogo-utils/src/main/java/com/mogo/utils/glide/GlideRoundedCornersTransform.java new file mode 100644 index 0000000000..7d0ad513bb --- /dev/null +++ b/foudations/mogo-utils/src/main/java/com/mogo/utils/glide/GlideRoundedCornersTransform.java @@ -0,0 +1,169 @@ +package com.mogo.utils.glide; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapShader; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.RectF; + +import androidx.annotation.NonNull; + +import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; +import com.bumptech.glide.load.resource.bitmap.CenterCrop; +import com.mogo.utils.BuildConfig; +import com.mogo.utils.R; + +import java.security.MessageDigest; + +/** + * Glide加载图片,使图片变成圆角图片工具 + * 基本用法Glide.with(this).load(imgUrl).apply(RequestOptions.bitmapTransform(GlideRoundedCornersTransform(this))).into(imageView) + * 如果想用多个Transform可以使用{@link com.bumptech.glide.load.MultiTransformation} 进行Transform的融合 + * @author tongchenfei + */ +public class GlideRoundedCornersTransform extends CenterCrop { + private float mRadius; + private CornerType mCornerType; + private static final int VERSION = 1; + private static final String ID = BuildConfig.LIBRARY_PACKAGE_NAME + "GlideRoundedCornersTransform." + VERSION; + private static final byte[] ID_BYTES = ID.getBytes(CHARSET); + + /** + * 待处理的圆角枚举 + */ + public enum CornerType { + ALL, + TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT, + TOP, BOTTOM, LEFT, RIGHT, + TOP_LEFT_BOTTOM_RIGHT, + TOP_RIGHT_BOTTOM_LEFT, + TOP_LEFT_TOP_RIGHT_BOTTOM_RIGHT, + TOP_RIGHT_BOTTOM_RIGHT_BOTTOM_LEFT, + TOP_LEFT_TOP_RIGHT + } + + public GlideRoundedCornersTransform(float radius, CornerType cornerType) { + super(); + mRadius = radius; + mCornerType = cornerType; + } + + @Override + protected Bitmap transform(@NonNull BitmapPool pool,@NonNull Bitmap toTransform, int outWidth, int outHeight) { + Bitmap transform = super.transform(pool, toTransform, outWidth, outHeight); + return roundCrop(pool, transform); + } + + private Bitmap roundCrop(BitmapPool pool, Bitmap source) { + if (source == null) { + return null; + } + int width = source.getWidth(); + int height = source.getHeight(); + Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); + + if (result == null) { + result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config + .ARGB_8888); + } + Canvas canvas = new Canvas(result); + Paint paint = new Paint(); + paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader + .TileMode.CLAMP)); + paint.setAntiAlias(true); + + Path path = new Path(); + drawRoundRect(canvas, paint, path, width, height); + + return result; + } + + private void drawRoundRect(Canvas canvas, Paint paint, Path path, int width, int height) { + float[] rids; + switch (mCornerType) { + case ALL: + rids = new float[]{mRadius, mRadius, mRadius, mRadius, mRadius, mRadius, mRadius, mRadius}; + drawPath(rids, canvas, paint, path, width, height); + break; + case TOP_LEFT: + rids = new float[]{mRadius, mRadius, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}; + drawPath(rids, canvas, paint, path, width, height); + break; + case TOP_RIGHT: + rids = new float[]{0.0f, 0.0f, mRadius, mRadius, 0.0f, 0.0f, 0.0f, 0.0f}; + drawPath(rids, canvas, paint, path, width, height); + break; + case BOTTOM_RIGHT: + rids = new float[]{0.0f, 0.0f, 0.0f, 0.0f, mRadius, mRadius, 0.0f, 0.0f}; + drawPath(rids, canvas, paint, path, width, height); + break; + case BOTTOM_LEFT: + rids = new float[]{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, mRadius, mRadius}; + drawPath(rids, canvas, paint, path, width, height); + break; + case TOP: + rids = new float[]{mRadius, mRadius, mRadius, mRadius, 0.0f, 0.0f, 0.0f, 0.0f}; + drawPath(rids, canvas, paint, path, width, height); + break; + case BOTTOM: + rids = new float[]{0.0f, 0.0f, 0.0f, 0.0f, mRadius, mRadius, mRadius, mRadius}; + drawPath(rids, canvas, paint, path, width, height); + break; + case LEFT: + rids = new float[]{mRadius, mRadius, 0.0f, 0.0f, 0.0f, 0.0f, mRadius, mRadius}; + drawPath(rids, canvas, paint, path, width, height); + break; + case RIGHT: + rids = new float[]{0.0f, 0.0f, mRadius, mRadius, mRadius, mRadius, 0.0f, 0.0f}; + drawPath(rids, canvas, paint, path, width, height); + break; + case TOP_LEFT_BOTTOM_RIGHT: + rids = new float[]{mRadius, mRadius, 0.0f, 0.0f, mRadius, mRadius, 0.0f, 0.0f}; + drawPath(rids, canvas, paint, path, width, height); + break; + case TOP_RIGHT_BOTTOM_LEFT: + rids = new float[]{0.0f, 0.0f, mRadius, mRadius, 0.0f, 0.0f, mRadius, mRadius}; + drawPath(rids, canvas, paint, path, width, height); + break; + case TOP_LEFT_TOP_RIGHT_BOTTOM_RIGHT: + rids = new float[]{mRadius, mRadius, mRadius, mRadius, mRadius, mRadius, 0.0f, 0.0f}; + drawPath(rids, canvas, paint, path, width, height); + break; + case TOP_RIGHT_BOTTOM_RIGHT_BOTTOM_LEFT: + rids = new float[]{0.0f, 0.0f, mRadius, mRadius, mRadius, mRadius, mRadius, mRadius}; + drawPath(rids, canvas, paint, path, width, height); + break; + case TOP_LEFT_TOP_RIGHT: + rids = new float[]{mRadius, mRadius, mRadius, mRadius, 0.0f, 0.0f, 0.0f, 0.0f}; + drawPath(rids, canvas, paint, path, width, height); + break; + default: + throw new RuntimeException("RoundedCorners type not belong to CornerType"); + } + } + + /** + * @param rids 圆角的半径,依次为左上角xy半径,右上角,右下角,左下角 + */ + private void drawPath(float[] rids, Canvas canvas, Paint paint, Path path, int width, int height) { + path.addRoundRect(new RectF(0, 0, width, height), rids, Path.Direction.CW); + canvas.drawPath(path, paint); + } + + @Override + public boolean equals(Object o) { + return o instanceof GlideRoundedCornersTransform; + } + + @Override + public int hashCode() { + return ID.hashCode(); + } + + @Override + public void updateDiskCacheKey(MessageDigest messageDigest) { + messageDigest.update(ID_BYTES); + } +}