Android中快速便捷的实现圆角按钮方法详解
发布时间 - 2026-01-11 01:10:00 点击率:次前言

大家应该都知道,圆角按钮是我们在做界面时常常遇到的UI样式。通常的办法,是做一个drawable,比如这样:
<?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!-- 填充的颜色 --> <solid android:color="#ffae00" /> <!-- 圆角的半径 --> <corners android:radius="10dp" /> </shape>
在Layout文件里Button的background属性设上这个drawable.xml,就可以了。
然而这样做的话,每次弄个按钮都得新做一个drawable文件,各种drawable多了看着就乱。
是不是可以把color和radius放到Button的属性里去,这样就不用每次再拖一个drawable.xml了是吧?
自定义RoundCornerButton
<widget.RoundCornerButton android:id="@+id/btn_commit" android:layout_width="100dp" android:layout_height="40dp" android:gravity="center" android:text="我的按钮" app:rcb_backgroundColor="@color/yellow" app:rcb_backgroundColorDisabled="@color/light_grey" app:rcb_cornerRadius="20dp" />
如果可以这样在Layout文件里直接设置背景色和圆角半径,是不是很方便!虽然不如drawable灵活,但是已经足以应付设计同学给出的圆角按钮的需求了。
我们就以定义自己的styleable属性开始吧
<declare-styleable name="RoundCornerButton"> <attr name="rcb_backgroundColor" format="color" /> <attr name="rcb_backgroundColorDisabled" format="color" /> <attr name="rcb_cornerRadius" format="dimension" /> </declare-styleable>
从Drawable扩展一个自己的Drawable,很简单
- 从构造方法传入color和radius,并创建一个实习的画笔;
- 覆写draw方法,有现成的画圆角矩形的方法可以调用;
- 暴露一个setRect方法给外边,用于设置绘制区域的宽高。
class RoundCornerDrawable extends Drawable {
final int color;
final float radius;
final Paint paint;
final RectF rectF;
RoundCornerDrawable(int color, float radius) {
this.color = color;
this.radius = radius;
// 实心的画笔
this.paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setAntiAlias(true);
paint.setColor(color);
this.rectF = new RectF();
}
// 用于设置Drawable宽高
public void setRect(int width, int height) {
this.rectF.left = 0;
this.rectF.top = 0;
this.rectF.right = width;
this.rectF.bottom = height;
}
@Override
public void draw(@NonNull Canvas canvas) {
canvas.drawRoundRect(rectF, radius, radius, paint); // 画圆角矩形,现成的方法
}
// 其余方法略
}
定义自己的Button类,有这么几个要点:
- 与通常的自定义View一样,覆写三个构造方法;
- 从AttributeSet里读取自定义的属性backgroundColor和cornerRadius,这里暂时忽略backgroundColorDisabled;
- 每一种状态(例如普通、禁用、按下)是一个RoundCornerDrawable,组合成一个StateListDrawable;
- onLayout的时候,记得改变每一个RoundCornerDrawable的尺寸。
public class RoundCornerButton extends AppCompatButton {
private int colorNormal;
private float cornerRadius;
private RoundCornerDrawable bgDrawableNormal = null;
// 省略三个构造方法
// 构造方法最后一定要调用initCornerBackground完成初始化
private void initCornerBackground(AttributeSet attrs, int defStyleAttr) {
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.RoundCornerButton, defStyleAttr, 0);
this.cornerRadius = a.getDimension(R.styleable.RoundCornerButton_rcb_cornerRadius, 0);
this.colorNormal = a.getColor(R.styleable.RoundCornerButton_rcb_backgroundColor, 0);
makeBackgroundDrawable();
a.recycle();
}
private void makeBackgroundDrawable() {
bgDrawableNormal = new RoundCornerDrawable(this.colorNormal, this.cornerRadius);
bgDrawableNormal.setRect(getWidth(), getHeight());
// 设计通常会给出禁用时的样式以及按下时的样式
// 所以这里用使用StateListDrawable
StateListDrawable bgDrawable = new StateListDrawable();
bgDrawable.addState(new int[]{android.R.attr.state_enabled, -android.R.attr.state_pressed}, bgDrawableNormal);
// 每多一种状态,在这里多加一项
setBackgroundDrawable(bgDrawable);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
// layout之后必然会draw,所以在这里设置drawable的尺寸
if (bgDrawableNormal != null) {
bgDrawableNormal.setRect(right - left, bottom - top);
}
// 每多一种状态,在这里多加一项
}
}
附上Demo源代码:https://github.com/realxu/CodeSamples/tree/master/Android/RoundCornerButtonDemo
这就可以啦,我们看看效果:
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# android
# 圆角按钮
# 圆形按钮
# 按钮设置圆角
# android xml实现按钮的圆角、阴影效果及按下变化效果的实现代码
# Android开发实现的圆角按钮、文字阴影按钮效果示例
# Android圆角按钮的制作方法
# Android实现空心圆角矩形按钮的实例代码
# Android中给按钮同时设置背景和圆角示例代码
# Android实现圆角Button按钮
# Android 圆角按钮的实现代码
# 自己的
# 圆角
# 在这里
# 自定义
# 做一个
# 按下
# 多加
# 是一个
# 看着
# 几个
# 这就
# 这样做
# 很简单
# 这篇文章
# 里去
# 谢谢大家
# 都得
# 就以
# 很方便
# 创建一个
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么使用Intervention Image库处理图片上传和缩放
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
北京的网站制作公司有哪些,哪个视频网站最好?
利用vue写todolist单页应用
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
微信小程序 wx.uploadFile无法上传解决办法
网站建设保证美观性,需要考虑的几点问题!
浅谈redis在项目中的应用
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
香港服务器如何优化才能显著提升网站加载速度?
Laravel如何配置任务调度?(Cron Job示例)
如何彻底删除建站之星生成的Banner?
打造顶配客厅影院,这份100寸电视推荐名单请查收
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
如何实现建站之星域名转发设置?
如何获取免费开源的自助建站系统源码?
Mybatis 中的insertOrUpdate操作
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
Laravel distinct去重查询_Laravel Eloquent去重方法
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
Python自动化办公教程_ExcelWordPDF批量处理案例
独立制作一个网站多少钱,建立网站需要花多少钱?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
Laravel如何处理和验证JSON类型的数据库字段
企业网站制作这些问题要关注
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
怎么用AI帮你设计一套个性化的手机App图标?
网站优化排名时,需要考虑哪些问题呢?
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
,网页ppt怎么弄成自己的ppt?
图册素材网站设计制作软件,图册的导出方式有几种?
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
Laravel如何创建自定义Facades?(详细步骤)
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
网站制作免费,什么网站能看正片电影?
使用spring连接及操作mongodb3.0实例
js实现获取鼠标当前的位置
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
如何在阿里云部署织梦网站?
大型企业网站制作流程,做网站需要注册公司吗?

