1. 程式人生 > >Android 5.0 Button 按鈕水紋效果的適配問題

Android 5.0 Button 按鈕水紋效果的適配問題

從5.0開始,一些控制元件的點選時候預設是有水紋效果的如下圖

這裡寫圖片描述

以Button舉例可以按照如下使用:
注意是android:theme

<Button  
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button"
    android:theme="@style/MyButton"/>

自定義樣式:

<style name="MyButton" parent="Theme.AppCompat.Light">  
    <item
name="colorControlHighlight">@color/indigo</item> <item name="colorButtonNormal">@color/pink</item> </style>

但是這樣在5.0以下的系統,這樣就沒有效果,按鈕會變成預設的灰色狀態,點選按鈕也不會有顏色的狀態區別
為了相容5.0以下的裝置,我們可以利用seletor(勘誤:button用theme在5.0以下也是有按壓變色的,雖然沒有水波紋,下面的方法仍然適用其他控制元件的適配)

 <Button
                android:id="@+
id/confirm"
style="@style/GreenButton" android:text="@string/confirm" />
  <style name="GreenButton">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">@dimen/button_height_tall</item>
        <item
name="android:background">@drawable/selector_green_button</item> <item name="android:textColor">@color/white</item> <item name="android:textSize">@dimen/font_large</item> </style>

我們可以在drawable和drawable-v21下新建同一份檔案selector_green_button.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@color/deep_green" android:state_pressed="true" />

    <item android:drawable="@color/green" />
</selector>
<!--v21下 -->
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/deep_green">//這裡是擴散水波紋的色值
    <item android:drawable="@color/green" />

</ripple>

有個問題需要注意,如果的想要你的波紋沒有按壓的時候為透明狀態,下面的寫法是無效的.會導致按壓沒有效果

<!--v21下 -->
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/deep_green">//這裡是擴散水波紋的色值
    <item android:drawable="@android:color/transparent" />//這裡你用透明色和透明的圖片都是沒有效果的
</ripple>

正確的做法如下:

<!--v21下 -->
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/deep_green">//這裡是擴散水波紋的色值
     <item android:id="@android:id/mask" android:drawable="@color/white" />裡面的色值可以任選一個
</ripple>

android:id=”@android:id/mask”會讓系統並不會真的繪製,並告知波紋的繪製邊界

如果寫成下面,波紋的繪製範圍會超出控制元件的邊界

<!--v21下 -->
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/deep_green">//這裡是擴散水波紋的色值
</ripple>

如上,這樣設定後5.0以下的裝置具有按鈕按下變色的效果,5.0以上就具有水波紋效果.其他控制元件同理