RecyclerViewアイテムへの波及効果の追加


104

RecyclerViewのアイテムにリップルエフェクトを追加しようとしています。オンラインで調べましたが、必要なものが見つかりませんでした。私はそれがカスタムエフェクトである必要があると思います。RecyclerView自体にandroid:background属性を試し、「?android:selectableItemBackground」に設定しましたが、機能しませんでした。

    <android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:focusable="true"
    android:clickable="true"
    android:background="?android:selectableItemBackground"
    android:id="@+id/recyclerView"
    android:layout_below="@+id/tool_bar"/>

これは、エフェクトを追加しようとしているRecyclerViewです。

ここに画像の説明を入力してください


1
この質問の重複ではないので、これを再開します。解決策は類似しているかもしれCardViewませんが、このより一般的な質問に関係しないよりも、その質問にaがあることの特定の側面があります。
Suragch 2018

@Suragch違いに気づいていただきありがとうございます:)
Georgi Koemdzhiev 2018

回答:


221

わかった。私がしなければならなかった唯一のことはこの属性を追加することです:

android:background="?android:attr/selectableItemBackground"

RecyclerViewアダプターがそのように膨張するレイアウトのルート要素に:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="8dp"
    android:paddingBottom="8dp"
    android:background="?android:attr/selectableItemBackground"
    tools:background="@drawable/bg_gradient">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="17sp"
        android:layout_marginLeft="15dp"
        android:layout_marginStart="15dp"
        android:id="@+id/shoppingListItem"
        android:hint="@string/enter_item_hint"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"/>

    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/shopping_list_item_checkbox_label"
        android:id="@+id/shoppingListCheckBox"
        android:layout_centerVertical="true"
        android:layout_marginRight="15dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:checked="false"/>

</RelativeLayout>

結果:

ここに画像の説明を入力してください

それでもリップル効果が見られない場合は、これらの線をレイアウトのルート要素にも追加してください。

android:clickable="true"
android:focusable="true"

3
ルート要素がCardViewの場合はどうなりますか?
Nabin、2016

6
@SpiderMan相対レイアウトまたは線形レイアウト内にコードを記述し、カードレイアウト内に配置する必要があります。
SanVed 2016

7
@pronoobsanved、これは私を助けました!それでも問題が解決しない場合、CardViewは1つのレイアウトを子として使用します。その子に対して、クリック可能、フォーカス可能をtrue、背景を?attr / selectedableItemBackgroundに設定します
Vamsi Challa

42
CardViewため@NabinKhadkaは、代わりに前景としてすなわち、それを設定android:foreground="?android:attr/selectableItemBackground"
ローンラリベルテ

6
android:clickable="true"この作業を行うには、オプションも追加する必要がありました
Joaquin Iurchuk

69

すでに回答したように、最も簡単な解決策は、RecyclerView行の背景として次のいずれかを追加することです。

  • android:background="?android:attr/selectableItemBackground"
  • android:background="?attr/selectableItemBackground"

ただし、この方法で問題が発生している場合、または色をより細かく制御したい場合は、以下を実行できます。

カスタムリップルエフェクト

この答えは、この単純なAndroid RecyclerViewの例から始まります。次の画像のようになります。

波及効果の例GIF

API 21以前のデバイス用のセレクターを追加

API 21(Android 5.0 Lollipop)以前は、RecyclerViewアイテムをクリックすると、背景色が変更されました(波及効果はありません)。それも私たちがやろうとしていることです。それらのデバイスを使用しているユーザーがまだいる場合は、その動作に慣れているので、あまり心配する必要はありません。(もちろん、本当に波及効果も必要な場合は、カスタムライブラリを使用できます。)

res/drawableフォルダを右クリックし、[ 新規]> [描画可能リソースファイル ]を選択します。それを呼ぶcustom_ripple。[OK]をクリックして、次のコードに貼り付けます。

custom_ripple.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <solid android:color="@color/colorAccent" />
        </shape>
    </item>
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>
</selector>

colorAccent既に使用可能だったので、押された状態のハイライト色として使用しましたが、好きな色を定義できます。

API 21以上のデバイスに波及効果を追加

res/drawableフォルダを右クリックし、[ 新規]> [描画可能リソースファイル ]を選択しますcustom_rippleもう一度電話して。ただし、今回はまだ[OK]をクリックしないでください。[ 利用可能な修飾子]リストから[ バージョン ]を選択し、[ >> ]ボタンをクリックし21て、プラットフォームAPIレベルを記述します。[OK]をクリックして、次のコードを貼り付けます。

v21 / custom_ripple.xml

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

    <item
        android:id="@android:id/mask"
        android:drawable="@android:color/white" />
</ripple>

繰り返しにcolorAccentなりますが、リップルカラーを使用したので使用しましたが、好きな色を使用できます。マスクは、波及効果を行レイアウトのみに限定します。マスクの色はどうやら問題ないので、不透明な白を使用しました。

背景に設定

RecyclerViewアイテムのルートレイアウトで、背景を、作成したカスタムリップルに設定します。

android:background="@drawable/custom_ripple"

開始したサンプルプロジェクトでは、次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:background="@drawable/custom_ripple"
    android:padding="10dp">

    <TextView
        android:id="@+id/tvAnimalName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"/>

</LinearLayout>

完成した

それでおしまい。これでプロジェクトを実行できるようになります。助けてくれたこの回答このYouTubeビデオに感謝します。


デフォルトの背景色にしたい場合は、 'android:id = "@ android:id / mask'行を削除して、ドローアブルの色を好きなように設定します
Jordan Hochstetler

26

見落としがちな細部が1つあると思います。

追加してもまだ波及効果が得られない場合android:background="?android:attr/selectableItemBackground"は、次の行をレイアウトのルートに追加してみてください。

android:clickable="true"
android:focusable="true"

これらは、ビューがクリック可能であることを確認し、上記の背景属性でリップル効果を有効にします


5

この行をアダプタのxmlルートビューに追加します

android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"

2

シンプルでカスタムアプローチは、ここで概説されているようにビューテーマを設定することです

some_view.xml

<ImageView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:background="?attr/selectableItemBackgroundBorderless"
   android:focusable="true"
   android:src="@drawable/up_arrow"
   android:theme="@style/SomeButtonTheme"/>

some_style.xml

<style name="SomeButtonTheme" >
   <item name="colorControlHighlight">@color/someColor</item>
</style>

他のカスタム実装はここにあります


1

ボタンスタイルの使用

これは数え切れないほど私のために働いています。

ボーダーレスボタンスタイルをレイアウトのルート要素に追加します。focusableclickable属性は必要ありません。デフォルトのスタイル設定ですべてがカプセル化されます。

<androidx.constraintlayout.widget.ConstraintLayout
    style="@android:style/Widget.Material.Button.Borderless"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

クールですが、これによりパディングが追加されます
ededede

@ededede min-height、max-height、width ... XML属性を使用して、好みに合わせて微調整できます。
Felix Favor Chinemerem
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.