Android中实现圆角图片有多种姿势,不知你解锁了几种?

方法一: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配置。
<com.facebook.drawee.view.SimpleDraweeView android:id="@+id/my_image_view" android:layout_width="20dp" android:layout_height="20dp" fresco:fadeDuration="300" fresco:actualImageScaleType="focusCrop" fresco:placeholderImage="@color/wait_color" fresco:placeholderImageScaleType="fitCenter" fresco:failureImage="@drawable/error" fresco:failureImageScaleType="centerInside" fresco:retryImage="@drawable/retrying" fresco:retryImageScaleType="centerCrop" fresco:progressBarImage="@drawable/progress_bar" fresco:progressBarImageScaleType="centerInside" fresco:progressBarAutoRotateInterval="1000" fresco:backgroundImage="@color/blue" fresco:overlayImage="@drawable/watermark" fresco:pressedStateOverlayImage="@color/red" fresco:roundAsCircle="false" fresco:roundedCornerRadius="1dp" fresco:roundTopLeft="true" fresco:roundTopRight="false" fresco:roundBottomLeft="false" fresco:roundBottomRight="true" fresco:roundWithOverlayColor="@color/corner_color" fresco:roundingBorderWidth="2dp" fresco:roundingBorderColor="@color/border_color" />
点评:
由框架实现,使用简单,稳定。
方法四:遮罩
此种方式还是使用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
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="150dp"
android:src="@color/colorAccent"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="@color/black_alpha_50"
android:padding="12dp"
android:text="I am text"/>
</LinearLayout>
<cn.ieclipse.af.view.RoundMaskView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:radius="10dp"
app:af_borderColor="@color/white"
app:af_borderWidth="1dp"/>
</FrameLayout>
配合FrameLayout,将LinearLayout实现了圆角,在视觉效果上,ImageView左上和右上圆角,TextView左下和右下圆角。
点评:
具有一定的局限性,不过不限于图片,所有的Layout都可以在视觉上实现圆角。
关于
QuickAF是一个Android平台上的app快速开发框架。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
相关文章:
实例解析angularjs的filter过滤器
如何通过老薛主机一键快速建站?
如何快速搭建高效服务器建站系统?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
如何通过主机屋免费建站教程十分钟搭建网站?
非常酷的网站设计制作软件,酷培ai教育官方网站?
网站微信制作软件,如何制作微信链接?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
如何通过建站之星自助学习解决操作问题?
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
建站之星收费标准详解:套餐费用及年费价格表一览
简单实现Android文件上传
网站制作知乎推荐,想做自己的网站用什么工具比较好?
建站之星如何助力企业快速打造五合一网站?
名字制作网站免费,所有小说网站的名字?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
零基础网站服务器架设实战:轻量应用与域名解析配置指南
建站之星后台管理:高效配置与模板优化提升用户体验
如何选择最佳自助建站系统?快速指南解析优劣
怀化网站制作公司,怀化新生儿上户网上办理流程?
如何选择高效响应式自助建站源码系统?
如何在七牛云存储上搭建网站并设置自定义域名?
已有域名和空间如何搭建网站?
用v-html解决Vue.js渲染中html标签不被解析的问题
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
如何用已有域名快速搭建网站?
广东专业制作网站有哪些,广东省能源集团有限公司官网?
如何在阿里云虚拟主机上快速搭建个人网站?
建站主机与服务器功能差异如何区分?
如何快速建站并高效导出源代码?
如何快速搭建虚拟主机网站?新手必看指南
建站之星后台密码遗忘或太弱?如何重置与强化?
建站主机功能解析:服务器选择与快速搭建指南
学校免费自助建站系统:智能生成+拖拽设计+多端适配
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
如何通过万网虚拟主机快速搭建网站?
简单实现Android验证码
安徽网站建设与外贸建站服务专业定制方案
如何在万网ECS上快速搭建专属网站?
电商网站制作价格怎么算,网上拍卖流程以及规则?
如何在建站之星绑定自定义域名?
深圳企业网站制作设计,在深圳如何网上全流程注册公司?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
,制作一个手机app网站要多少钱?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
如何在IIS服务器上快速部署高效网站?
盘锦网站制作公司,盘锦大洼有多少5G网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。