两种使用 BitmapTransformation
来实现Glide
加载圆形图片和圆角图片的方法。
背景 Glide
并不能直接支持 Round Pictures
,需要使用 BitmapTransformation
来进行处理。
Round Pictures: CircleImageView
/ CircularImageView
/ RoundedImageView
are known to have issues with TransitionDrawable (.crossFade() with .thumbnail() or .placeholder()) and animated GIFs, use a BitmapTransformation (.circleCrop() will be available in v4) or .dontAnimate() to fix the issue.
这里介绍下网上常见的方式和使用 RoundedBitmapDrawable
两种方法,本质上是差不多的:
使用 Canvas
和 Paint
来绘制
使用 Android.support.v4.graphics.drawable.RoundedBitmapDrawable
PS: RoundedBitmapDrawable
是 support.v4
下的一个类,想了解更多,可以阅读我之前的文章:Android 必知必会-使用 supportV4 的 RoundedBitmapDrawable 实现圆角 。
代码实现 方法一 实现圆形图片:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 public class GlideCircleTransform extends BitmapTransformation { public GlideCircleTransform (Context context) { super (context); } @Override protected Bitmap transform (BitmapPool pool, 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 = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); } 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 String getId () { return getClass().getName(); } }
实现圆角图片:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 public class GlideRoundTransform extends BitmapTransformation { private static float radius = 0f ; public GlideRoundTransform (Context context) { this (context, 4 ); } public GlideRoundTransform (Context context, int dp) { super (context); radius = Resources.getSystem().getDisplayMetrics().density * dp; } @Override protected Bitmap transform (BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { return roundCrop(pool, toTransform); } 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 ); RectF rectF = new RectF (0f , 0f , source.getWidth(), source.getHeight()); canvas.drawRoundRect(rectF, radius, radius, paint); return result; } @Override public String getId () { return getClass().getName() + Math.round(radius); } }
方法二 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public static Bitmap drawableToBitmap (Drawable drawable) { int w = drawable.getIntrinsicWidth(); int h = drawable.getIntrinsicHeight(); Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565; Bitmap bitmap = Bitmap.createBitmap(w, h, config); Canvas canvas = new Canvas (bitmap); drawable.setBounds(0 , 0 , w, h); drawable.draw(canvas); return bitmap; }
实现圆形:
1 2 3 RoundedBitmapDrawable drawableA = RoundedBitmapDrawableFactory.create(getResources(), bitmap); drawableA.setCircular(true ); Bitmap a = drawableToBitmap(drawableA);
实现圆角:
1 2 3 RoundedBitmapDrawable drawableB = RoundedBitmapDrawableFactory.create(getResources(), bitmap); drawableB.setCornerRadius(30L ); Bitmap b = drawableToBitmap(drawableB);