Android之glide加载图片圆角效果
16lz
2022-01-28
1 问题
Android加载图片需要圆角化,有什么简单粗暴的方法吗?当然有,用我们的神器glide
2 解决办法
1)简单办法
ImageView imageView = (ImageView)helper.getView(R.id.keepHomeAppImageview); Glide.with(mContext) .asBitmap() .load(iconUrl)// .override(180, 180) .centerCrop()// .sizeMultiplier(0.5f) .into(new BitmapImageViewTarget(imageView) { @Override protected void setResource(Bitmap resource) { RoundedBitmapDrawable circularBitmapDrawable = RoundedBitmapDrawableFactory. create(mContext.getResources(), resource); circularBitmapDrawable.setCornerRadius(20); imageView.setImageDrawable(circularBitmapDrawable); } });
2)复杂办法
public static void loadCircleImage(Context context, ImageView view, String path, boolean leftTop, boolean rightTop, boolean leftBottom, boolean rightBottom, int radius) { RoundedCornersTransform transform = new RoundedCornersTransform(context, UnitUtils.dip2px(context, radius)); transform.setNeedCorner(leftTop, rightTop, leftBottom, rightBottom); RequestOptions options = new RequestOptions().placeholder(RandomColorUtils.getRandomColor()).transform(transform); Glide.with(context).asBitmap().load(path).apply(options).into(view); } public static void loadCircleImage(Context context, ImageView view, String path, int radius) { loadCircleImage(context, view, path, true, true, true, true, radius); } public static void loadCircleImage(ImageView view, String path, int radius) { loadCircleImage(BaseApp.getInstance().getContext(), view, path, true, true, true, true, radius); }
public class RoundedCornersTransform implements Transformation { private BitmapPool mBitmapPool; private float radius; private boolean isLeftTop, isRightTop, isLeftBottom, isRightBotoom; /** * 需要设置圆角的部分 * * @param leftTop 左上角 * @param rightTop 右上角 * @param leftBottom 左下角 * @param rightBottom 右下角 */ public void setNeedCorner(boolean leftTop, boolean rightTop, boolean leftBottom, boolean rightBottom) { isLeftTop = leftTop; isRightTop = rightTop; isLeftBottom = leftBottom; isRightBotoom = rightBottom; } /** * @param context 上下文 * @param radius 圆角幅度 */ public RoundedCornersTransform(Context context, float radius) { this.mBitmapPool = Glide.get(context).getBitmapPool(); this.radius = radius; } @NonNull @Override public Resource transform(@NonNull Context context, @NonNull Resource resource, int outWidth, int outHeight) { Bitmap source = resource.get(); int finalWidth, finalHeight; //输出目标的宽高或高宽比例 float scale; if (outWidth > outHeight) { //如果 输出宽度 > 输出高度 求高宽比 scale = (float) outHeight / (float) outWidth; finalWidth = source.getWidth(); //固定原图宽度,求最终高度 finalHeight = (int) ((float) source.getWidth() * scale); if (finalHeight > source.getHeight()) { //如果 求出的最终高度 > 原图高度 求宽高比 scale = (float) outWidth / (float) outHeight; finalHeight = source.getHeight(); //固定原图高度,求最终宽度 finalWidth = (int) ((float) source.getHeight() * scale); } } else if (outWidth < outHeight) { //如果 输出宽度 < 输出高度 求宽高比 scale = (float) outWidth / (float) outHeight; finalHeight = source.getHeight(); //固定原图高度,求最终宽度 finalWidth = (int) ((float) source.getHeight() * scale); if (finalWidth > source.getWidth()) { //如果 求出的最终宽度 > 原图宽度 求高宽比 scale = (float) outHeight / (float) outWidth; finalWidth = source.getWidth(); finalHeight = (int) ((float) source.getWidth() * scale); } } else { //如果 输出宽度=输出高度 finalHeight = source.getHeight(); finalWidth = finalHeight; } //修正圆角 this.radius *= (float) finalHeight / (float) outHeight; Bitmap outBitmap = this.mBitmapPool.get(finalWidth, finalHeight, Bitmap.Config.ARGB_8888); if (outBitmap == null) { outBitmap = Bitmap.createBitmap(finalWidth, finalHeight, Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(outBitmap); Paint paint = new Paint(); //关联画笔绘制的原图bitmap BitmapShader shader = new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); //计算中心位置,进行偏移 int width = (source.getWidth() - finalWidth) / 2; int height = (source.getHeight() - finalHeight) / 2; if (width != 0 || height != 0) { Matrix matrix = new Matrix(); matrix.setTranslate((float) (-width), (float) (-height)); shader.setLocalMatrix(matrix); } paint.setShader(shader); paint.setAntiAlias(true); RectF rectF = new RectF(0.0F, 0.0F, (float) canvas.getWidth(), (float) canvas.getHeight()); //先绘制圆角矩形 canvas.drawRoundRect(rectF, this.radius, this.radius, paint); //左上角圆角 if (!isLeftTop) { canvas.drawRect(0, 0, radius, radius, paint); } //右上角圆角 if (!isRightTop) { canvas.drawRect(canvas.getWidth() - radius, 0, canvas.getWidth(), radius, paint); } //左下角圆角 if (!isLeftBottom) { canvas.drawRect(0, canvas.getHeight() - radius, radius, canvas.getHeight(), paint); } //右下角圆角 if (!isRightBotoom) { canvas.drawRect(canvas.getWidth() - radius, canvas.getHeight() - radius, canvas.getWidth(), canvas.getHeight(), paint); } return BitmapResource.obtain(outBitmap, this.mBitmapPool); } @Override public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) { }}
更多相关文章
- Android(安卓)自定义进度条
- Android(安卓)Dialog在底部显示且宽度match_parent
- Android(安卓)沉浸式全屏(StatusBar,NavigationBar)
- android AlertDialog自定义大小
- 【Android】 dialog 设置maxHeight 最大高度
- Android工具类
- android朋友圈监听键盘状态 点击空白区域隐藏键盘
- android AlertDialog自定义大小
- Android高仿QQ下拉刷新