Ripple effect over a RecyclerView item containing ImageView

帅比萌擦擦* 提交于 2019-12-17 21:49:14

问题


I have a RecyclerView that expands the following grid item :

<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>

But the ripple effect doesn't appear unless I set the SquareImageView's visibility to invisible. It seems the ripple effect is drawn below the SquareImageView. How can I can I make it drawn over the SquareImageView?


回答1:


add below code to your parent layout

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

if you want custom ripple effect add this ripple_custom.xml in your 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>

to support older version add ripple_custom.xml in 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>



回答2:


Change:

android:background="?selectableItemBackground"

To:

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

And add this to your SquareImageView

android:clickable="false" 



回答3:


We can wrap RecyclerView Item inside FrameLayout and set android:foreground property to it. Checkout following link for details. It works for me pretty well.




回答4:


If you have a CardView + ImageView
just insert in CardView

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

And for RelativeLayout + ImageView
Insert in RelativeLayout

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

Or

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

This codes worked for me




回答5:


Your SquareImageView is filling up the entire space (width is match_parent and height is wrap_content) and so the SquareImageView receives the click event.

What worked in my case was setting the clickable state of all objects in your RelativeLayout to false:

android:clickable="false"

Just make sure your RelativeLayout handles the click event in your activity. In my code I set the RelativeLayout to a view v and set an onClick Listener on it to handle the CheckBox within my List item.

v.setOnClickListener(this);

Hopefully this helps anyone who reads it.




回答6:


Above answers are correct. but I want to recommend the usage of android:foreground instead as it shows the ripple infront of the imageView.

On your root view, add the following.

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

I know it's a pretty late answer to such old thread. But who knows, someone might actually find it useful.



来源:https://stackoverflow.com/questions/28636377/ripple-effect-over-a-recyclerview-item-containing-imageview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!