我使用的是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"
/>
如果您可以使用第三方库,请查看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 "
我来这篇文章寻找一种方法,有一个背景颜色的我的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>
它就像一个魔法。我想同样的技巧也可以用在按钮上。祝你好运。
@ianhanniballake的回答是绝对正确和简单的。但我花了几天时间才明白。对于那些不理解他的回答的人,这里有更详细的实现
<Button
android:id="@+id/btn"
style="@style/MaterialButton"
... />
<style name="MaterialButton" parent="Widget.AppCompat.Button.Colored">
<item name="android:theme">@style/Theme.MaterialButton</item>
...
</style>
<style name="Theme.MaterialButton" parent="YourTheme">
<item name="colorAccent">@color/yourAccentColor</item>
<item name="colorButtonNormal">@color/yourButtonNormalColor</item>
</style>
= = = = = =
<Button
android:id="@+id/btn"
style="@style/Widget.AppCompat.Button.Colored"
android:theme="@style/Theme.MaterialButton" />
<style name="Theme.MaterialButton" parent="YourTheme">
<item name="colorAccent">@color/yourAccentColor</item>
<item name="colorButtonNormal">@color/yourButtonNormalColor</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"/>
如果您可以使用第三方库,请查看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 "
以编程方式应用颜色:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
ColorStateList colorStateListRipple = new ColorStateList(
new int[][] {{0}},
new int[] {Color.WHITE} // ripple color
);
RippleDrawable rippleDrawable = (RippleDrawable) myButton.getBackground();
rippleDrawable.setColor(colorStateListRipple);
myButton.setBackground(rippleDrawable); // applying the ripple color
}
ColorStateList colorStateList = new ColorStateList(
new int[][]{
new int[]{android.R.attr.state_pressed}, // when pressed
new int[]{android.R.attr.state_enabled}, // normal state color
new int[]{} // normal state color
},
new int[]{
Color.CYAN, // when pressed
Color.RED, // normal state color
Color.RED // normal state color
}
);
ViewCompat.setBackgroundTintList(myButton, colorStateList); // applying the state colors