Android中Glide加载圆形图片和圆角图片实例代码
程序员文章站
2023-11-30 23:38:58
一、简介:
介绍两种使用 bitmaptransformation 来实现 glide 加载圆形图片和圆角图片的方法。glide 并不能直接支持 round pict...
一、简介:
介绍两种使用 bitmaptransformation 来实现 glide 加载圆形图片和圆角图片的方法。glide 并不能直接支持 round pictures ,需要使用 bitmaptransformation 来进行处理。
二、网上的实现方式
这里介绍下网上常见的方式和使用 roundedbitmapdrawable 两种方法,本质上是差不多的:
- 使用 canvas 和 paint 来绘制
- 使用 android.support.v4.graphics.drawable.roundedbitmapdrawable
实现圆形图片:
/** * * glide 圆形图片 transform */ 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(); } }
实现圆角图片:
/** * glide 圆角 transform */ public class glideroundtransform extends bitmaptransformation { private static float radius = 0f; /** * 构造函数 默认圆角半径 4dp * * @param context context */ public glideroundtransform(context context) { this(context, 4); } /** * 构造函数 * * @param context context * @param dp 圆角半径 */ 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); } }
三、笔者比较喜欢的简便的实现方式
//加载圆角图片 public static void loadroundimage(final context context, string url,final imageview imageview){ glide.with(context) .load(url) .asbitmap() .placeholder(placeholder) .error(placeholder) .diskcachestrategy(diskcachestrategy.all) //设置缓存 .into(new bitmapimageviewtarget(imageview){ @override protected void setresource(bitmap resource) { super.setresource(resource); roundedbitmapdrawable circularbitmapdrawable = roundedbitmapdrawablefactory.create(context.getresources(), resource); circularbitmapdrawable.setcornerradius(10); //设置圆角弧度 imageview.setimagedrawable(circularbitmapdrawable); } }); } //加载圆形图片 public static void loadcirclepic(final context context, string url, final imageview imageview) { glide.with(context) .load(url) .asbitmap() .placeholder(placeholder) .error(placeholder) .diskcachestrategy(diskcachestrategy.all) //设置缓存 .into(new bitmapimageviewtarget(imageview) { @override protected void setresource(bitmap resource) { roundedbitmapdrawable circularbitmapdrawable = roundedbitmapdrawablefactory.create(context.getresources(), resource); circularbitmapdrawable.setcircular(true); imageview.setimagedrawable(circularbitmapdrawable); } }); }
关于drawabletobitmap的源码的实现是这样的
public static bitmap drawabletobitmap(drawable drawable) { // 取 drawable 的长宽 int w = drawable.getintrinsicwidth(); int h = drawable.getintrinsicheight(); // 取 drawable 的颜色格式 bitmap.config config = drawable.getopacity() != pixelformat.opaque ? bitmap.config.argb_8888 : bitmap.config.rgb_565; // 建立对应 bitmap bitmap bitmap = bitmap.createbitmap(w, h, config); // 建立对应 bitmap 的画布 canvas canvas = new canvas(bitmap); drawable.setbounds(0, 0, w, h); // 把 drawable 内容画到画布中 drawable.draw(canvas); return bitmap; } /** * roundedbitmapdrawable 是 v4 下的一个类,不能简单的通过:强制转换成 bitmapdrawable * bitmap bitmap = ((bitmapdrawable)xxx).getbitmap(); */
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: Html5大文件断点续传实现方法
下一篇: 你知道微博营销营销优势有哪些吗