我似乎无法让按下状态波纹在 Spinner 上工作。单个下拉项目有波纹,但没有微调器本身。我认为这可能是预期的行为,但是材料设计指南中的这个动画清楚地显示了在选项下拉列表出现之前具有按下状态波纹的微调器。
6 回答
我创建了一个新Spinner
的Activity
,正如你所描述的,RippleDrawable
它不适用于Spinner
使用 v7 兼容性库或 Android 5.0+。这对我来说并不奇怪。谷歌经常无法实现自己的设计。
为了产生影响,我所做的只是RippleDrawable
在 res/values-v21/ 中创建一个并将其设置为Spinner
using的背景spinner.setBackgroundResource(R.drawable.spinner_background);
。我相信你也可以在你的主题中设置它。
Github 上有一个库,即Material Ripple Layout。该库支持预棒棒糖和棒棒糖设备。此外,您可以为波纹创建自己的颜色。这是用法:
Spinner spinner = (Spinner) findViewById(R.id.spinner);
MaterialRippleLayout.on(spinner)
.rippleColor(Color.BLACK)
.create();
但我不使用那个库。我正在使用Spinner
Support Library rev 23.0.1 中引入的默认波纹,方法是在模块中编译:in compile 'com.android.support:appcompat-v7:23.0.1'
。build.gradle
app
Spinner
所以,这是我的布局的完整代码:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Spinner
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:dropDownVerticalOffset="@dimen/dropDown_spinner"
style="@style/SpinnerStyle"/> <!-- apply the ripple style -->
</RelativeLayout>
样式定义在res/values/styles.xml
:
<style name="SpinnerStyle" parent="Widget.AppCompat.Light.Spinner.DropDown.ActionBar">
<item name="android:background">?android:selectableItemBackground</item>
<item name="android:dropDownSelector">?android:selectableItemBackground</item>
<item name="android:divider">@null</item>
<item name="overlapAnchor">true</item>
</style>
之后,涟漪效应应该会按预期工作。
Spinner 没有波纹,因为背景不可波纹。我在selectableItemBackgroundBorderless
布局(https://developer.android.com/training/material/animations.html#Touch)中如下所示:
a
0
-widthSpinner
,并删除向下箭头的背景(可以使用@null
),即使我删除了普通 Spinner 的背景,它也没有开膛手,所以我像谷歌日历一样使用 TextView 和 ImageView。a
TextView
+ImageView
(用于向下箭头)
当用户单击 TextView/ImageView 时,它会出现波纹动画,然后调用 Spinner。performClick
. 我希望它作为正常的下拉菜单,所以我制作了一个0
-width 微调器,因为gone
微调器不会调用onItemSelected
.
对于隐藏的适配器,它可能是这样的:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
((TextView) view).setText("");
return view;
}
布局点击监听器:
layout.setOnClickListener(() -> {
spinner.performClick();
});
对于微调项侦听器:
spinner.setOnItemSelectedListener(() -> {
// this requires spinner's visiblity is not gone
});
在 xml 中设置这些 Spinner 属性
android:background="@drawable/ripple_effect"
android:dropDownSelector="@drawable/ripple_effect"
而ripple_effect.xml 看起来像这样
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?android:colorControlHighlight" >
<item android:id="@android:id/mask">
<shape android:shape="rectangle" >
<solid android:color="?android:colorAccent" />
</shape>
</item>
</ripple>
希望下面的代码能给 Spinner 上的涟漪效应带来一些意义。
波纹旋转器.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>
你的 XML :-
your_acitivity.xml
<Spinner
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:dropDownSelector="@drawable/ripple_spinner"
android:popupBackground="@drawable/popup_spinner_item_background"
/>
下面将更改下拉菜单的背景。
popup_spinner_item_background.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="2dp" />
<solid android:color="@android:color/white" />
</shape>
在您的 res/values/styles.xml 中:-
样式.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>
希望它会帮助你。
我一直在使用这个很酷的库来将涟漪效果应用于某些视图。我喜欢它,因为您可以在 XML 文件中包装任何视图,它会应用涟漪效果。
https://github.com/balysv/material-ripple
希望能帮助到你。