扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
本篇文章给大家分享的是有关Android中怎么对图片进行圆角处理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
创新互联专注于企业成都全网营销、网站重做改版、东川网站定制设计、自适应品牌网站建设、HTML5、商城开发、集团公司官网建设、外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为东川等各大城市提供网站开发制作服务。
方法一:setXfermode法
此种方式就是再new一个相同尺寸的bitmap,然后使用paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));先画圆角矩形,再画原始bitmap,然后就得到了一个圆角的bitmap了。
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; }
点评:
早期用得较多,占用bitmap双倍内存。
方法二:使用BitmapShader
此种方式是先将bitmap生成BitmapShader,然后将其绘制到canvas中, 部分关键代码如下,完整代码请参考QuickAF中的RoundImageView
bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); paint.setShader(bitmapShader); @Override public void draw(Canvas canvas) { Rect bounds = getBounds(); canvas.drawRoundRect(fillRect, radius, radius, paint); if (mBorderWidth > 0) { if (mIsCircle) { canvas.drawCircle(bounds.width() / 2, bounds.height() / 2, radius, strokePaint); } else { canvas.drawRoundRect(fillRect, radius, radius, strokePaint); } } }
点评:
占用内存较大,实现有点小复杂。
方法三:图片加载库
目前github上有许多流行的图片加载库,基于上都附带圆角图片功能,只需要稍微配置一下,即可轻松的实现想要的效果。其实在底层,无非也是使用上面的两种方式。比如Android-Universal-Image-Loader 早期的RoundedBitmapDisplayer使用setXfermode来实现,后来使用BitmapShader实现。
DisplayImageOptions options = new DisplayImageOptions.Builder() .displayer(new RoundedBitmapDisplayer()) // display rounded bitmap .build();
再以比较另类的fresco为例,虽然底层是以C实现,不过在圆角处理上,仍然还是在Java层实现,用的方式还是BitmapShader。不过对于非bitmap的圆角实现,fresco是用Paint直接画的。附上fresco配置。
点评:
由框架实现,使用简单,稳定。
方法四:遮罩
此种方式还是使用setXfermode,不过与方法一不同的是:不对图片作任何更改,只在圆角之外再画一层与背景颜色相同的四个角来遮挡,在视觉上造成圆角图片的效果。关键代码如下:
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (src != null && dst != null) { int w = getMeasuredWidth(), h = getMeasuredHeight(); int sc = canvas.saveLayer(0, 0, w, h, null, Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG); canvas.drawBitmap(dst, 0, 0, paint); // 圆角矩形 paint.setXfermode(mode); // new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT); canvas.drawBitmap(src, 0, 0, paint); // 长方形 paint.setXfermode(null); canvas.restoreToCount(sc); } }
详细代码请参考QuickAF中的RoundMaskView
使用这种方式,圆角化的对象不限于ImageView,还可以是任意的layout哦,比如下面的示例
配合FrameLayout,将LinearLayout实现了圆角,在视觉效果上,ImageView左上和右上圆角,TextView左下和右下圆角。
点评:
具有一定的局限性,不过不限于图片,所有的Layout都可以在视觉上实现圆角。
以上就是Android中怎么对图片进行圆角处理,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流