问题
I want to use ripple effects on Buttons. AppCompat v22.1 added AppCompatButton and new functionalities to AppCompat tinting.
My Layout:
<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" />
On my API 22 test device the ripple effect works perfectly, but i'm coding for API 11 and unfortunately backgroundTint needs API >= 21. How can i set the ripple effect to Buttons on older API versions?
回答1:
Just use app:backgroundTint
instead of android:backgroundTint
, the tint will take effect below Lollipop. The reason is AppCompatActivity
AppCompatDelegateImplV7
use AppCompatViewInflater
to auto change Button or TextView to AppCompatButton or AppCompatTextView, then app:backgroundTint
take effect.
回答2:
Ripples are not available as a build in functionality on Android <21. This is due to performance issues: devices with the new API can use the RenderThread which is not available to older devices. See also: http://android-developers.blogspot.de/2014/10/appcompat-v21-material-design-for-pre.html
Why are there no ripples on pre-Lollipop? A lot of what allows RippleDrawable to run smoothly is Android 5.0’s new RenderThread. To optimize for performance on previous versions of Android, we've left RippleDrawable out for now.
回答3:
To support ripple functionality below API 21 you may have to add a drawable in the background of your button:
<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" />
Then you have to add your xmls with the same name in both drawable and drawable-v21 directories (if you don't have them you may create and they will be automatically linked).
/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>
来源:https://stackoverflow.com/questions/29890654/appcompatbutton-backgroundtint-api-21