我使用的是Android v21支持库。

我已经创建了一个自定义背景色的按钮。当我使用背景色时,材质设计效果如波纹,显示消失了(除了点击时的抬高)。

 <Button
 style="?android:attr/buttonStyleSmall"
 android:background="?attr/colorPrimary"
 android:textColor="@color/white"
 android:textAllCaps="true"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:text="Button1"
 />

下面是一个正常的按钮,效果很好。

<Button
 style="?android:attr/buttonStyleSmall"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:textAllCaps="true"
 android:text="Button1"
/>


当前回答

当你使用android:background时,你正在用空白颜色替换按钮的大部分样式和外观。

更新:在23.0.0版本的AppCompat发布中,有一个新的Widget.AppCompat.Button.Colored样式,它使用你的主题的colorButtonNormal来禁用颜色,colorAccent来启用颜色。

这可以让你直接应用到你的按钮通过

<Button
  ...
  style="@style/Widget.AppCompat.Button.Colored" />

如果你需要一个自定义的colorButtonNormal或colorAccent,你可以使用一个ThemeOverlay,正如在这个专业技巧和android:主题上的按钮。

以前的回答

你可以在你的v21目录中使用一个可绘制的后台,比如:

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="?attr/colorControlHighlight">
    <item android:drawable="?attr/colorPrimary"/>
</ripple>

这将确保你的背景颜色是?attr/colorPrimary,并使用默认的?attr/colorControlHighlight(如果你愿意,你也可以在你的主题中设置)拥有默认的波纹动画。

注意:你必须为v21以下的版本创建一个自定义选择器:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/primaryPressed" android:state_pressed="true"/>
    <item android:drawable="@color/primaryFocused" android:state_focused="true"/>
    <item android:drawable="@color/primary"/>
</selector>

假设有一些您想要的默认、按下和聚焦状态的颜色。就我个人而言,我在被选中的过程中截取了一个波纹的屏幕截图,并从中提取了主/聚焦状态。

其他回答

编程:

 myMaterialButton.setRippleColor(ColorStateList.valueOf(Color.RED));

例如:

 MaterialButton myMaterialButton = new MaterialButton(this);
 myMaterialButton.setLayoutParams(myButtonParams);
 myMaterialButton.setBackgroundColor(Color.GRAY);
 myMaterialButton.setRippleColor(ColorStateList.valueOf(Color.RED));
   

如果您可以使用第三方库,请查看traex/RippleEffect。它允许您仅用几行代码就可以向任何视图添加涟漪效应。你只需要在你的xml布局文件中,包装你想用com. anddexert .library. rippleview容器产生涟漪效应的元素。

作为额外的奖励,它需要Min SDK 9,这样你就可以在不同的操作系统版本之间保持设计一致性。

下面是一个摘自图书馆GitHub回购的例子:

<com.andexert.library.RippleView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:rv_centered="true">

    <ImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@android:drawable/ic_menu_edit"
        android:background="@android:color/holo_blue_dark"/> 

</com.andexert.library.RippleView>

你可以通过在RippleView元素中添加这个属性来改变波纹颜色:app:rv_color="@color/ my_fany_ripple_color "

使用AppCompat(22.1.1+),你可以添加这样的样式:

<style name="MyGreenButton">
    <item name="colorButtonNormal">#009900</item>
</style>

并通过应用样式来使用它:

<android.support.v7.widget.AppCompatButton
    style="@style/MyGreenButton"
    android:layout_width="match_width"
    android:layout_height="wrap_content"
    android:text="A Green Button"
    />

通过编程改变颜色,我发现更新颜色的唯一方法(在API 15或16上)是使用“背景色调列表”。它不会删除API 21设备上漂亮的径向动画:

ColorStateList colorStateList = new ColorStateList(new int[][] {{0}}, new int[] {0xFF009900}); // 0xAARRGGBB
button.setSupportBackgroundTintList(colorStateList);

因为button. setbackground(…)和button. getbackground ().mutate(). setcolorfilter(…)在API 15和16中不会像在API 21中那样改变按钮的颜色。

我来这篇文章寻找一种方法,有一个背景颜色的我的ListView项目,但保持波纹。

我简单地添加了我的颜色作为背景,selectableItemBackground作为前景:

<style name="my_list_item">
    <item name="android:background">@color/white</item>
    <item name="android:foreground">?attr/selectableItemBackground</item>
    <item name="android:layout_height">@dimen/my_list_item_height</item>
</style>

它就像一个魔法。我想同样的技巧也可以用在按钮上。祝你好运。

appcompat-v7的V22.1版本引入了一些新的可能性。现在可以将特定的主题仅分配给一个视图。

不赞成使用应用程序:主题样式工具栏。您现在可以使用 android:所有API级别7及以上设备的工具栏主题 android: API级别11及以上的所有小部件的主题支持 设备。

因此,我们不再在全局主题中设置所需的颜色,而是创建一个新的主题并仅将其分配给按钮

例子:

<style name="MyColorButton" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorButtonNormal">@color/myColor</item>
</style>

并使用这种风格作为主题的按钮

<Button
 style="?android:attr/buttonStyleSmall"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:text="Button1"
 android:theme="@style/MyColorButton"/>