私はCardViewにAndroid XMLを設定することで触れた時の波及効果を表示させようとしています。アクティビティXMLファイルでbackgound属性を ここ で記述Android Developersページですが、うまくいきません。アニメーションはまったくありませんが、onClickのメソッドが呼び出されます。ここで提案されているとおり ripple.xmlファイルを作成してみました が、同じ結果になりました。
アクティビティのXMLファイルに表示されるCardView。
<Android.support.v7.widget.CardView
xmlns:card_view="http://schemas.Android.com/apk/res-auto"
Android:layout_width="155dp"
Android:layout_height="230dp"
Android:elevation="4dp"
Android:translationZ="5dp"
Android:clickable="true"
Android:focusable="true"
Android:focusableInTouchMode="true"
Android:onClick="showNotices"
Android:background="?android:attr/selectableItemBackground"
Android:id="@+id/notices_card"
card_view:cardCornerRadius="2dp">
</Android.support.v7.widget.CardView>
私は比較的Androidの開発に慣れていないので、私はいくつかの明らかな間違いを犯したかもしれません。
前もって感謝します。
CardView
に以下を追加してください。
Android:foreground="?android:attr/selectableItemBackground"
Android:clickable="true"
これら2行のコードをxmlビューに追加して、cardViewに波及効果を与えてください。
Android:clickable="true"
Android:foreground="?android:attr/selectableItemBackground"
私はどうにかしてcardviewに波及効果を得ることができました:
<Android.support.v7.widget.CardView
xmlns:card_view="http://schemas.Android.com/apk/res-auto"
Android:clickable="true"
Android:foreground="@drawable/custom_bg"/>
また、上記のコードに表示されるcustom_bgには、Lollipop(drawable-v21パッケージ内)とpre-Lollipop(drawableパッケージ内)の両方のデバイス用のxmlファイルを定義する必要があります。 drawable-v21パッケージのcustom_bgの場合、コードは次のとおりです。
<ripple
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:color="?android:attr/colorControlHighlight">
<item
Android:id="@Android:id/mask"
Android:drawable="@Android:color/white"/>
</ripple>
drawableパッケージのcustom_bgの場合、コードは次のとおりです。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_pressed="true">
<shape>
<solid Android:color="@color/colorHighlight"></solid>
</shape>
</item>
<item>
<shape>
<solid Android:color="@color/navigation_drawer_background"></solid>
</shape>
</item>
</selector>
そのため、Lollipopより前のデバイスではしっかりとしたクリック効果があり、LollipopデバイスではCardviewに波及効果があります。
Appcompatサポートライブラリで波及効果が省略されています。波紋を確認したい場合は、Android Lバージョンを使用してAndroid Lデバイスでテストしてください。 AppCompat v7サイトあたり:
「ロリポップ以前に波紋がないのはなぜですか?RippleDrawableを円滑に実行するための多くの要素は、Android 5.0の新しいRenderThreadです。以前のバージョンのAndroidでパフォーマンスを最適化するために、RippleDrawableは今のところ残しています。
詳しくはこちらのリンク をご覧ください 。
使用しているアプリminSdkVersion
がレベル9の場合は、次のものを使用できます。
Android:foreground="?selectableItemBackground"
Android:clickable="true"
代わりに、レベル11から始めて、あなたは使用します:
Android:foreground="?android:attr/selectableItemBackground"
Android:clickable="true"
ドキュメントから:
clickable - このビューがクリックイベントに反応するかどうかを定義します。 「true」または「false」のブール値でなければなりません。
foreground - コンテンツを描画するためのドロウアブルを定義します。これはオーバーレイとして使用できます。重力が塗りつぶしに設定されている場合、前景のドロアブルはコンテンツのパディングに参加します。
私にとっては、foreground
をCardView
に追加してもうまくいきませんでした(理由不明:/)
その子レイアウトに同じものを追加すると、うまくいきました。
コード:
<Android.support.v7.widget.CardView xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:card_view="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/card_view"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="center"
Android:focusable="true"
Android:clickable="true"
card_view:cardCornerRadius="@dimen/card_corner_radius"
card_view:cardUseCompatPadding="true">
<LinearLayout
Android:id="@+id/card_item"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:foreground="?android:attr/selectableItemBackground"
Android:padding="@dimen/card_padding">
</LinearLayout>
</Android.support.v7.widget.CardView>
RelativeLayoutやLinearLayoutのようにCardViewのすべてのアダプタ項目のコンポーネントを含むルートレイアウトがある場合は、そのルートレイアウトにbackground属性を設定する必要があります。好きです:
<Android.support.v7.widget.CardView xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:card_view="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="122dp"
Android:layout_marginBottom="6dp"
Android:layout_marginLeft="6dp"
Android:layout_marginRight="6dp"
card_view:cardCornerRadius="4dp">
<RelativeLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@drawable/touch_bg"/>
</Android.support.v7.widget.CardView>
リップル AndroidのCardview
コントロールのイベント:
<Android.support.v7.widget.CardView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="center"
Android:foreground="?android:attr/selectableItemBackground"
Android:clickable="true"
Android:layout_marginBottom="4dp"
Android:layout_marginTop="4dp" />
私はAppCompatに満足していなかったので、私は私自身のCardViewを書き、さざ波をバックポートしました。これはGingerbreadを搭載したGalaxy S上で実行されているので、間違いなく可能です。
詳しくは ソースコード をチェックしてください。
Button、Linear Layout、またはCardViewのような任意のビューに対して、これら2つのコードを魅力的なように組み合わせて追加するだけで、これら2行を追加して魔法を見ることができます。
Android:foreground="?android:attr/selectableItemBackground"
Android:clickable="true"
RecyclerViewに表示されているプログラムで作成されたCardView(または私の場合はCardViewを拡張するカスタムビュー)で波紋効果が機能しないという問題の解決策を探している人には、以下が役に立ちました。 XMLレイアウトファイルで宣言的に他の回答に記載されているXML属性を基本的に宣言することは、プログラムで作成されたCardView、またはカスタムレイアウトから作成されたCardViewでは機能しないようです。それらはプログラム的に次のように設定する必要があります。
private class MadeUpCardViewHolder extends RecyclerView.ViewHolder {
private MadeUpCardView cardView;
public MadeUpCardViewHolder(View v){
super(v);
this.cardView = (MadeUpCardView)v;
// Declaring in XML Layout doesn't seem to work in RecyclerViews
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int[] attrs = new int[]{R.attr.selectableItemBackground};
TypedArray typedArray = context.obtainStyledAttributes(attrs);
int selectableItemBackground = typedArray.getResourceId(0, 0);
typedArray.recycle();
this.cardView.setForeground(context.getDrawable(selectableItemBackground));
this.cardView.setClickable(true);
}
}
}
ここでMadeupCardView extends CardView
は、TypedArray
の部分のために この答え と称します。
Android:foreground="?android:attr/selectableItemBackgroundBorderless"
Android:clickable="true"
Android:focusable="true"
Api 21のみを使用してこれを使用すると、このリストの行カードビューは使用されません
Xmlに以下を追加してください。
Android:clickable="true"
Android:focusable="true"
Android:background="?android:attr/selectableItemBackground"
そして、あなたのアダプタに追加してください(それがあなたのケースなら)
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val attrs = intArrayOf(R.attr.selectableItemBackground)
val typedArray = holder.itemView.context.obtainStyledAttributes(attrs)
val selectableItemBackground = typedArray.getResourceId(0, 0)
typedArray.recycle()
holder.itemView.isClickable = true
holder.itemView.isFocusable = true
holder.itemView.foreground = holder.itemView.context.getDrawable(selectableItemBackground)
}
}