web-dev-qa-db-fra.com

Effet d'ondulation sur un élément RecyclerView contenant ImageView

J'ai une RecyclerView qui développe l'élément de grille suivant:

<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:layout_marginLeft="@dimen/children_tile_border"
    Android:layout_marginTop="@dimen/children_tile_border"
    Android:clickable="true"
    Android:focusable="true"
    Android:background="?selectableItemBackground"
    tools:ignore="RtlHardcoded">

        <com.example.app.ui.widget.SquareImageView
            Android:id="@+id/child_picture"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:visibility="visible"
            Android:layout_alignParentBottom="true"/>

        <LinearLayout
            Android:orientation="vertical"
            Android:layout_width="match_parent"
            Android:layout_height="68dp"
            Android:background="@color/tile_text_background"
            Android:gravity="center_vertical"
            Android:layout_alignParentBottom="true">

            ..............
        </LinearLayout>
</RelativeLayout>

Mais l'effet d'entraînement n'apparaît que si je règle la visibilité de SquareImageView's sur invisible. Il semble que l’effet d’ondulation soit dessiné au-dessous de SquareImageView. Comment puis-je dessiner sur la SquareImageView?

42
Binoy Babu

ajoutez le code ci-dessous à votre mise en page parent 

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

si vous voulez un effet d'entraînement personnalisé, ajoutez ce fichier ripple_custom.xml dans drawable-v21 

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

    <item
        Android:id="@Android:id/mask"
        Android:drawable="@color/windowBackground" />
</ripple>

pour supporter l'ancienne version, ajoutez ripple_custom.xml dans drawable 

<?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/colorHighlight" />
        </shape>
    </item>
    <item>
        <shape Android:shape="rectangle">
            <solid Android:color="@Android:color/transparent" />
        </shape>
    </item>
</selector>
64
Jinu

Changement:

Android:background="?selectableItemBackground"

À:

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

Et ajoutez ceci à votre SquareImageView

Android:clickable="false" 
12
Enzokie

Nous pouvons envelopper RecyclerView Item dans FrameLayout et y définir la propriété Android:foreground. Commander suivant link pour plus de détails. Cela fonctionne assez bien pour moi.

8
Sagar Trehan

Votre SquareImageView remplit tout l'espace (width est match_parent et height est wrap_content) et donc SquareImageView reçoit l'événement de clic. 

Ce qui a bien fonctionné dans mon cas a été de définir l'état False de tous les objets de votre RelativeLayout:

Android:clickable="false"

Assurez-vous simplement que votre RelativeLayout gère l'événement click de votre activité. Dans mon code, j'ai défini RelativeLayout sur view v et un onClick Listener dessus pour qu'il puisse gérer CheckBox dans l'élément de liste.

v.setOnClickListener(this);

Espérons que cela aide tous ceux qui le lisent.

1
Hugo Mulder

Si vous avez un CardView + ImageView 
il suffit d’insérer dans CardView

Android:focusable="true"
Android:foreground="?android:attr/selectableItemBackground"

Et pour RelativeLayout + ImageView 
Insérer dans RelativeLayout

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

Ou

Android:focusable="true"
Android:background="?attr/selectableItemBackground"

Ce code a fonctionné pour moi

1
Mahdi Hossaini

Les réponses ci-dessus sont correctes. mais je tiens à recommander l'utilisation d'Android: au premier plan, car il montre l'ondulation devant l'imageView.

Sur votre vue racine, ajoutez ce qui suit.

Android:foreground="@drawable/ripple_effect_color_primary"
Android:clickable="true"
Android:focusable="true"

Je sais que c'est une réponse assez tardive à ce vieux fil. Mais qui sait, quelqu'un pourrait trouver cela utile.

0
Sami Adam