【问题标题】:Button Style api 21按钮样式 api 21
【发布时间】:2026-02-12 03:40:01
【问题描述】:

我在 api 21 上看到了新的按钮动画:

但我想用蓝色来做到这一点,我在另一个问题上看到在 buttonstyle.xml 中使用这种自定义样式(在 Drawables 文件夹上):

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?attr/colorControlHighlight">
    <item>
        <shape xmlns:android="http://schemas.android.com/apk/res/android">
            <corners android:radius="2dp" />
            <solid android:color="@color/Blue" />
        </shape>
    </item>
</ripple>

但是我的 min API 是 14 并且它崩溃了,因为我需要 min 21 才能使用涟漪,如果用户有 android 5 可以用蓝色显示这个动画,如果用户有较低版本显示正常动画,我该怎么做还是蓝色的?

谢谢!

【问题讨论】:

  • 旧 API 中没有 ripple
  • 但是是否有两种样式可供选择,应用程序根据用户的 api 选择一种?因为现在,使用 Android 5 模拟器中的默认样式,您会看到 API 21 效果,如果我在 Android 4.4 模拟器中打开应用程序,我会看到正常效果,所以可以这样做,我只想更改颜色。谢谢你的回答。

标签: android button styles


【解决方案1】:

使用https://github.com/ozodrukh/RippleDrawable 库!

buttonstyle.xml:

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/Blue" >
    <!-- @color/Blue is ripple color -->
    <!-- item(id=mask): image which will be filled by ripple -->
    <item 
        android:id="@android:id/mask">
        <!-- default button background image -->
        <inset
            android:insetLeft="@dimen/abc_button_inset_horizontal_material"
            android:insetTop="@dimen/abc_button_inset_vertical_material"
            android:insetRight="@dimen/abc_button_inset_horizontal_material"
            android:insetBottom="@dimen/abc_button_inset_vertical_material">
            <shape android:shape="rectangle">
                <corners android:radius="@dimen/abc_control_corner_material" />
                <!-- e0e0e0 is default backround color -->
                <!-- this solid element can be removed, but i dont test this -->
                <solid android:color="#e0e0e0" />
                <padding android:left="@dimen/abc_button_padding_horizontal_material"
                    android:top="@dimen/abc_button_padding_vertical_material"
                    android:right="@dimen/abc_button_padding_horizontal_material"
                    android:bottom="@dimen/abc_button_padding_vertical_material" />
            </shape>
        </inset>
    </item>
    <!-- item(none): default button background -->
    <item>
        <!-- default button background image -->
        <inset
            android:insetLeft="@dimen/abc_button_inset_horizontal_material"
            android:insetTop="@dimen/abc_button_inset_vertical_material"
            android:insetRight="@dimen/abc_button_inset_horizontal_material"
            android:insetBottom="@dimen/abc_button_inset_vertical_material">
            <shape android:shape="rectangle">
                <corners android:radius="@dimen/abc_control_corner_material" />
                <!-- e0e0e0 is default backround color -->
                <solid android:color="#e0e0e0" />
                <padding android:left="@dimen/abc_button_padding_horizontal_material"
                    android:top="@dimen/abc_button_padding_vertical_material"
                    android:right="@dimen/abc_button_padding_horizontal_material"
                    android:bottom="@dimen/abc_button_padding_vertical_material" />
            </shape>
        </inset>
    </item>
</ripple>

活动:

//button is your button
button.setBackgroundDrawable(LollipopDrawablesCompat.getDrawable(getResources(), R.drawable.buttonstyle, getTheme()));
button.setOnTouchListener(new DrawableHotspotTouch((LollipopDrawable) button.getBackground()));

有效! https://i.stack.imgur.com/pzI04.png

【讨论】: