AppCompatButton backgroundTint API< 21

时间:2015-04-27 08:23:45

标签: android android-button android-appcompat rippledrawable

我想在按钮上使用涟漪效果。 AppCompat v22.1为AppCompat着色添加了AppCompatButton和新功能。

我的布局:

<android.support.v7.widget.AppCompatButton
        android:id="@+id/add_remove_button"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:backgroundTint="@color/primary"
        android:textColor="@android:color/white"
        android:text="Remove" />

在我的API 22测试设备上,涟漪效果非常有效,但我编写的是API 11,不幸的是,backgroundTint需要API&gt; = 21.如何在较旧的API版本上将涟漪效果设置为按钮?< / p>

4 个答案:

答案 0 :(得分:78)

只需使用app:backgroundTint代替android:backgroundTint,色彩将在Lollipop下生效。原因是AppCompatActivity AppCompatDelegateImplV7使用AppCompatViewInflater自动将Button或TextView更改为AppCompatButton或AppCompatTextView,然后app:backgroundTint生效。

enter image description here

答案 1 :(得分:2)

在Android&lt; 21上,涟漪不可用作内置功能。这是由于性能问题:使用新API的设备可以使用旧设备无法使用的RenderThread。 另见:http://android-developers.blogspot.de/2014/10/appcompat-v21-material-design-for-pre.html

  

前棒棒糖为什么没有涟漪?   许多允许RippleDrawable顺利运行的是Android 5.0的新RenderThread。为了优化以前版本Android的性能,我们暂时将RippleDrawable排除在外。

答案 2 :(得分:1)

我分享的是我的用例:它与 ImageView 一起使用:

app:backgroundTint 未生效,因为我在该 Imageview 中为背景图像使用了 android:src 标记。

当我为 Imageview 将其更改为 android:background 时,app:backgroundTint 工作得很好。

不同答案中提到的第二个用例应该使用

androidx.appcompat.widget.AppCompatImageView

而不是ImageView

答案 3 :(得分:0)

要支持API 21下的涟漪功能,您可能需要在按钮的背景中添加一个drawable:

<android.support.v7.widget.AppCompatButton
    android:id="@+id/add_remove_button"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/button_ripple"
    android:backgroundTint="@color/primary"
    android:textColor="@android:color/white"
    android:text="Remove" />

然后你必须在drawable和drawable-v21目录中添加同名的xmls(如果你没有它们,你可以创建它们,它们会自动链接)。

/res/drawable-v21/button_ripple.xml

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/white">
    <item>
        <shape>
            <solid android:color="@color/white" />
        </shape>
    </item>
</ripple>

/res/drawable/button_ripple.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <solid android:color="@color/white" />
        </shape>
    </item>
</selector>