前言

大家应该都知道,圆角按钮是我们在做界面时常常遇到的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,很简单
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类,有这么几个要点:
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 圆角按钮的实现代码
# 自己的
# 圆角
# 在这里
# 自定义
# 做一个
# 按下
# 多加
# 是一个
# 看着
# 几个
# 这就
# 这样做
# 很简单
# 这篇文章
# 里去
# 谢谢大家
# 都得
# 就以
# 很方便
# 创建一个
相关文章:
太原网站制作公司有哪些,网约车营运证查询官网?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
,sp开头的版面叫什么?
建站之星官网登录失败?如何快速解决?
定制建站模板如何实现SEO优化与智能系统配置?18字教程
宝塔建站无法访问?如何排查配置与端口问题?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
建站之家VIP精选网站模板与SEO优化教程整合指南
制作销售网站教学视频,销售网站有哪些?
如何在万网自助建站平台快速创建网站?
如何选购建站域名与空间?自助平台全解析
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
香港服务器选型指南:免备案配置与高效建站方案解析
电脑免费海报制作网站推荐,招聘海报哪个网站多?
建站之星展会模板:智能建站与自助搭建高效解决方案
简单实现Android验证码
如何选择最佳自助建站系统?快速指南解析优劣
网站制作知乎推荐,想做自己的网站用什么工具比较好?
建站为何优先选择香港服务器?
建站org新手必看:2024最新搭建流程与模板选择技巧
如何在企业微信快速生成手机电脑官网?
,在苏州找工作,上哪个网站比较好?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
如何制作一个表白网站视频,关于勇敢表白的小标题?
如何在Tomcat中配置并部署网站项目?
简单实现Android文件上传
如何解决ASP生成WAP建站中文乱码问题?
如何高效完成自助建站业务培训?
微信小程序 input输入框控件详解及实例(多种示例)
c++ stringstream用法详解_c++字符串与数字转换利器
定制建站如何定义?其核心优势是什么?
济南企业网站制作公司,济南社保单位网上缴费步骤?
盘锦网站制作公司,盘锦大洼有多少5G网站?
网站制作服务平台,有什么网站可以发布本地服务信息?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
C++时间戳转换成日期时间的步骤和示例代码
如何在搬瓦工VPS快速搭建网站?
兔展官网 在线制作,怎样制作微信请帖?
C#怎么使用委托和事件 C# delegate与event编程方法
电商网站制作价格怎么算,网上拍卖流程以及规则?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
b2c电商网站制作流程,b2c水平综合的电商平台?
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
如何基于云服务器快速搭建网站及云盘系统?
制作证书网站有哪些,全国城建培训中心证书查询官网?
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
详解jQuery中基本的动画方法
相册网站制作软件,图片上的网址怎么复制?
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
*请认真填写需求信息,我们会在24小时内与您取得联系。