Spinner下拉项目彩色背景的涟漪效应(appcompat-v7 V21)

时间:2015-01-09 12:41:12

标签: android android-spinner android-appcompat material-design rippledrawable

我尝试对Spinner下拉项目应用涟漪效果,如下所示:

activity.java

    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
            this, R.array.array_name, R.layout.simple_spinner_dropdown_item);
    adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
    Spinner mSpinner = (Spinner) findViewById(R.id.spinner);
    mSpinner.setAdapter(adapter);

simple_spinner_dropdown_item.xml

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@android:id/text1"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:background="@drawable/spinner_ripple"
   android:ellipsize="marquee"
   android:gravity="center_horizontal"
   android:padding="10dip"
   android:singleLine="true"
   android:textSize="14sp" />

spinner_ripple.xml

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

但在下拉列表中,仅当第一项时 只有当前所选项目是第一项时才是。在所有其他情况下,它用波纹颜色填充背景项(没有涟漪效果)。 我的代码哪里错了?

已经尝试:无法在下拉项目布局的背景上设置固定颜色并在Spinner元素下移动涟漪效果,如下所示:

simple_spinner_dropdown_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@android:id/text1"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:background="@android:color/white"
   android:ellipsize="marquee"
   android:gravity="center_horizontal"
   android:padding="10dip"
   android:singleLine="true"
   android:textSize="14sp" />

activity_layout.xml

<Spinner
   android:id="@+id/spinner"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:drawSelectorOnTop="true"
   android:dropDownSelector="@drawable/spinner_ripple" />

3 个答案:

答案 0 :(得分:5)

如果您希望默认情况下将下拉列表项设置为白色并仅在用户触摸时突出显示涟漪效果,则需要在 spinner_ripple.xml drawable中实现正确的状态列表:

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

此处,android:state_pressed="true"表示只有在用户实际按下视图时才应用选择器项。如果您想支持其他选择器状态,请查看StateListDrawable参考。

根据官方Android Developers blog的说法,请记住AppCompat-v7 v21不支持涟漪效应:

  

为什么前Lollipop上没有涟漪?许多允许RippleDrawable顺利运行的是Android 5.0的新RenderThread。为了优化以前版本Android的性能,我们暂时离开了RippleDrawable。

所以它只适用于Lollypop。

答案 1 :(得分:5)

您的第二种方法是正确的,但正如this question中所述,android:dropDownSelector属性不起作用,这是一个众所周知的错误。

此外,如果您想更改下拉背景颜色,则需要设置Spinner's android:popupBackground,而不是设置下拉项目的背景。

整个解决方案将是这样的:

<强> popup_background.xml

<!--Based on Android's popup_background_material.xml-->
<!--This changes the background of the drop-down-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
    <corners android:radius="2dp" />
    <solid android:color="@android:color/white" />
</shape>

<强> styles.xml

<resources>
    <style name="AppTheme" parent="android:Theme.Material.Light">
        <!--Workaround for the Android bug-->
        <item name="android:dropDownListViewStyle">@style/Theme.MyListView</item>
    </style>

    <style name="Theme.MyListView" parent="@android:style/Widget.Material.ListView.DropDown">
        <item name="android:listSelector">@drawable/spinner_ripple</item>
    </style>
</resources>

<强> activity.xml

...
<Spinner
    android:id="@+id/spinner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:dropDownSelector="@drawable/spinner_ripple"
    android:popupBackground="@drawable/popup_background"
    />
...

spinner_ripple.xml (原创)

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <ripple android:color="?android:attr/colorControlHighlight">
            <item>
                <shape>
                    <solid android:color="@android:color/white" />
                </shape>
            </item>
        </ripple>
    </item>
</selector>

答案 2 :(得分:0)

我相信你的spinner_ripple.xml

需要两层
<!-- Background -->
<ripple android:color="#ff00ff00">
    <item android:drawable="@android:color/black" />
<ripple />

<!-- Ripple color -->
<ripple android:color="#ff00ff00">
    <item android:drawable="@android:color/white" />
<ripple />