押された状態のリップルをスピナーで動作させることができないようです。個々のドロップダウン項目にはリップルがありますが、スピナー自体はありません。これは予期された動作ではないかと思いましたが、マテリアル デザイン ガイドラインのこのアニメーションは、オプション ドロップダウンが表示される前に、押された状態の波紋のあるスピナーを明確に示しています。
6 に答える
で新規作成しましたSpinner
が、ごActivity
説明のとおり、v7 互換ライブラリRippleDrawable
の使用や Android 5.0 以降には適用されません。Spinner
これは私にとって驚くべきことではありません。Google は独自の設計を実装できないことがよくあります。
影響を与えるためにRippleDrawable
、 res/values-v21/ にを作成し、それSpinner
を usingの背景に設定するだけでしたspinner.setBackgroundResource(R.drawable.spinner_background);
。これをテーマに設定することもできると思います。
これらの Spinner プロパティを xml で設定します
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>
Github にMaterial Ripple Layoutというライブラリがあります。このライブラリは、Lollipop 以前のデバイスと Lollipop デバイスをサポートしています。また、波紋の独自の色を作成することもできます。使用法は次のとおりです。
Spinner spinner = (Spinner) findViewById(R.id.spinner);
MaterialRippleLayout.on(spinner)
.rippleColor(Color.BLACK)
.create();
しかし、私はそのライブラリを使用しません。Spinner
サポート ライブラリ rev 23.0.1 で導入された のデフォルトの ripple を使用して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>
その後、波及効果は期待どおりに機能するはずです。
以下のコードがスピナーのリップル効果に何らかの意味を与えることを願っています.
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 :-
あなたのアクティビティ.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>
それがあなたを助けることを願っています。
背景はリップル可能ではないため、Spinner にはリップルはありません。レイアウトで次のようにしselectableItemBackgroundBorderless
ます(https://developer.android.com/training/material/animations.html#Touch):
a
0
-widthSpinner
、下向きの矢印の背景を削除します (使用し@null
ても問題ありません)。通常のスピナーの背景を削除しても、リッパーがないため、Google カレンダーのように TextView と ImageView を使用します。a
TextView
+ImageView
(下向き矢印)
ユーザーが TextView/ImageView をクリックすると、リップル アニメーションが表示され、Spinner が呼び出されます。performClick
. そして、私はそれを通常のドロップダウンにしたいので、スピナーが呼び出さないので、0
幅のスピナーを作ります。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 ファイルで任意のビューをラップでき、波及効果が適用されるため、気に入っています。
https://github.com/balysv/material-ripple
それが役に立てば幸い。