一、前言:
圆角加边框的效果.png
二、实现
1、使用:
/**
* 注释:显示带圆角的图片
* 时间:2021/8/6 0006 9:41
* 作者:郭翰林
*
* @param context
* @param url
* @param image
* @param radius
*/
public static void loadImage(Context context, String url, ImageView image, int radius) {
RequestOptions requestOptions = new RequestOptions()
.placeholder(R.mipmap.load_image)
.error(R.mipmap.load_image)
.transform(new GlideRoundTransform(context, radius))
.dontAnimate();
Glide.with(context).load(url).apply(requestOptions).into(image);
}
/**
* 注释:圆角带边框
* 时间:2021/9/23 0023 18:26
* 作者:郭翰林
*
* @param context
* @param url
* @param image
* @param radius
* @param borderColor
* @param borderWidth
*/
public static void loadImage(Context context, String url, ImageView image, int radius, String borderColor, int borderWidth) {
RequestOptions requestOptions = new RequestOptions()
.placeholder(R.mipmap.load_image)
.error(R.mipmap.load_image)
.transform(new GlideRoundTransform(context, radius, borderColor, borderWidth))
.dontAnimate();
Glide.with(context).load(url).apply(requestOptions).into(image);
}
调用:
//圆角20dp
GlideUtils.loadImage(context, uri, live_preview_image, 20)
//圆角20dp,边框1dp颜色白色(颜色和宽度需要设置,默认没有)
GlideUtils.loadImage(context, uri, live_preview_image, 20, "#ffffff", 1)
2、转换器
package com.twl.qichechaoren_business.librarypublic.utils.glide;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.CenterCrop;
import java.security.MessageDigest;
/**
* 注释:Glide圆角转换器
* 时间:2021/8/6 0006 9:39
* 作者:郭翰林
*/
public class GlideRoundTransform extends CenterCrop {
private static float mRadius = 0f;
private static float mBorderWidth = 0f;
private static String mBorderColor;
public GlideRoundTransform(Context context) {
this(context, 4);
}
/**
* 注释:圆角
* 时间:2021/9/23 0023 18:00
* 作者:郭翰林
*
* @param context
* @param radius
*/
public GlideRoundTransform(Context context, int radius) {
mRadius = Resources.getSystem().getDisplayMetrics().density * radius;
}
/**
* 圆角带边框
*
* @param context
* @param radius
* @param borderColor
* @param borderWidth
*/
public GlideRoundTransform(Context context, int radius, String borderColor, int borderWidth) {
mRadius = Resources.getSystem().getDisplayMetrics().density * radius;
mBorderColor = borderColor;
mBorderWidth = Resources.getSystem().getDisplayMetrics().density * borderWidth;
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
Bitmap transform = super.transform(pool, toTransform, outWidth, outHeight);
return roundCrop(pool, transform);
}
private static Bitmap roundCrop(BitmapPool pool, Bitmap source) {
if (source == null) return null;
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);
if (!TextUtils.isEmpty(mBorderColor)) {
//绘制圆角带边框
Paint borderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);//设置边框样式
borderPaint.setColor(Color.parseColor(mBorderColor));
borderPaint.setStyle(Paint.Style.STROKE);
borderPaint.setStrokeWidth(mBorderWidth);
drawRoundRect(canvas, paint, source.getWidth(), source.getHeight(), borderPaint);
} else {
//绘制圆角
RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
canvas.drawRoundRect(rectF, mRadius, mRadius, paint);
}
return result;
}
/**
* 注释:绘制边框
* 时间:2021/9/23 0023 18:20
* 作者:郭翰林
*
* @param canvas
* @param paint
* @param width
* @param height
* @param borderPaint
*/
private static void drawRoundRect(Canvas canvas, Paint paint, float width, float height, Paint borderPaint) {
float right = width;
float bottom = height;
float halfBorder = mBorderWidth / 2;
Path path = new Path();
float[] pos = new float[8];
int shift = 0b1111;
int index = 3;
while (index >= 0) {//设置四个边角的弧度半径
pos[2 * index + 1] = ((shift & 1) > 0) ? mRadius : 0;
pos[2 * index] = ((shift & 1) > 0) ? mRadius : 0;
shift = shift >> 1;
index--;
}
path.addRoundRect(new RectF(halfBorder, halfBorder, right - halfBorder, bottom - halfBorder),
pos
, Path.Direction.CW);
canvas.drawPath(path, paint);//绘制要加载的图形
canvas.drawPath(path, borderPaint);//绘制边框
}
@Override
public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {
}
}
网友评论