在 Android 中为 Button 添加圆角背景和点击效果,最推荐的方式有三种。
方法一:使用 MaterialButton (最简单,推荐)
如果你使用的是 Google 的 Material Components 库(现代 Android 项目默认都有),直接在 XML 中配置即可,无需创建额外的 Drawable 文件。
优点: 代码简洁,自带水波纹(Ripple)点击效果。
xml
<com.google.android.material.button.MaterialButton
android:id="@+id/myButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="圆角按钮"
<!-- 设置背景颜色 -->
app:backgroundTint="#2196F3"
<!-- 设置圆角大小 -->
app:cornerRadius="12dp"
<!-- 设置水波纹颜色(点击效果) -->
app:rippleColor="#FFFFFF"
<!-- 如果需要边框 -->
app:strokeColor="#BBDEFB"
app:strokeWidth="2dp" />
方法二:使用 XML Drawable (最灵活,自定义强)
如果你需要更复杂的自定义,或者使用的是普通的 Button 或 AppCompatButton,可以创建一个资源文件。
1. 创建背景文件
在 res/drawable 目录下新建一个文件 btn_rounded_ripple.xml:
xml
<?xml version="1.0" encoding="utf-8"?>
<!-- ripple 节点实现点击时的水波纹效果 -->
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#40FFFFFF"> <!-- 水波纹的颜色 -->
<!-- 正常状态下的背景形状 -->
<item>
<shape android:shape="rectangle">
<!-- 填充颜色 -->
<solid android:color="#2196F3" />
<!-- 圆角幅度 -->
<corners android:radius="10dp" />
</shape>
</item>
</ripple>
2. 在布局中应用
xml
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="自定义背景按钮"
android:background="@drawable/btn_rounded_ripple"
android:textColor="#FFFFFF" />
注意:在某些 Material 主题下,普通 Button 可能无法直接通过 android:background 修改颜色。如果背景没生效,请使用 android:backgroundTint="@null" 或者改用 android:appcompat.widget.AppCompatButton。

要让点击效果(水波纹)完美贴合你的圆角矩形,最标准的方法是:**将你的 Shape 作为按钮的背景,并同时将其作为一个"遮罩(Mask)"来限制水波纹的边界。**可以直接创建一个新的 Drawable 文件(例如 btn_rounded_stroke_ripple.xml):
xml
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#203385ff"> <!-- 这里设置水波纹的颜色,通常用带透明度的颜色 -->
<!-- 第一部分:按钮的正常外观 -->
<item android:id="@android:id/background">
<shape android:shape="rectangle">
<corners android:radius="16dp" />
<stroke
android:width="2dp"
android:color="#3385ff" />
<!-- 如果需要中间有填充颜色,可以加上 <solid /> -->
<solid android:color="@android:color/transparent" />
</shape>
</item>
<!-- 第二部分:遮罩(Mask),作用是限制水波纹只在圆角矩形内显示 -->
<!-- 注意:必须指定 android:id="@android:id/mask" -->
<item android:id="@android:id/mask">
<shape android:shape="rectangle">
<corners android:radius="16dp" />
<solid android:color="#FFFFFF" /> <!-- 颜色不重要,重要的是形状 -->
</shape>
</item>
</ripple>
关键点说明:
-
<ripple>标签 :它是实现点击水波纹的核心。android:color决定了点击时扩散的光圈颜色。 -
android:id="@android:id/mask":这是最重要的部分。如果不加这个遮罩,点击时水波纹会溢出到圆角之外,变成一个直角矩形,非常难看。 -
颜色建议 :水波纹颜色通常建议使用主色调并加上 10%~20% 的透明度(例如
#203385ff),这样看起来比较自然。
方法三:传统 Selector 方式 (适用于旧版本或非水波纹需求)
如果你不想用水波纹,而是想点击时让按钮颜色变深/变浅。
1. 创建背景文件
xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 按下状态 -->
<item android:state_pressed="true">
<shape android:shape="rectangle">
<solid android:color="#1976D2" /> <!-- 深蓝色 -->
<corners android:radius="10dp" />
</shape>
</item>
<!-- 默认状态 -->
<item>
<shape android:shape="rectangle">
<solid android:color="#2196F3" /> <!-- 亮蓝色 -->
<corners android:radius="10dp" />
</shape>
</item>
</selector>
2. 在布局中引用
xml
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="传统点击效果"
android:background="@drawable/btn_selector" />
总结建议
- 首选
MaterialButton:因为它不需要额外写 XML 文件,通过app:cornerRadius即可控制圆角,且性能和兼容性最好。 - 需要复杂图形用
ripple标签 :如果你需要渐变色背景或者特殊形状,使用ripple结合shape是 Android 5.0 之后的标准做法。 - 注意主题覆盖 :如果设置了
android:background却没显示颜色,记得检查你的themes.xml是否继承了Theme.MaterialComponents.*,如果是,通常需要使用app:backgroundTint。 - 未触发点击状态:确保你的 View 是 android:clickable="true"(Button 默认是 true,如果是 TextView 则需要手动开启)。