Эффект ряби над элементом RecyclerView, содержащим ImageView

У меня есть 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: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>

Но эффект ряби не появляется, пока я не установлю SquareImageView's видимость невидимой. Кажется, что волновой эффект рисуется ниже SquareImageView, Как я могу сделать это поверх SquareImageView?

5 ответов

Решение

Добавьте код ниже в ваш родительский макет

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

если вы хотите собственный эффект ряби, добавьте этот ripple_custom.xml в свой 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>

для поддержки старой версии добавьте ripple_custom.xml в 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>

Изменить:

android:background="?selectableItemBackground"

Для того, чтобы:

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

И добавьте это в ваш SquareImageView

android:clickable="false" 

Мы можем обернуть элемент RecyclerView внутри FrameLayout и установить android:foreground собственность к нему. Оформить заказ по ссылке для получения подробной информации. Это работает для меня довольно хорошо.

Если у вас есть CardView + ImageView
просто вставьте в CardView

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

И для RelativeLayout + ImageView
Вставить в RelativeLayout

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

Или же

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

Этот код работал для меня

Ваш SquareImageView заполняет все пространство (width является match_parent а также height является wrap_content) и так SquareImageView получает событие клика.

Что сработало в моем случае, так это установление кликабельного состояния всех объектов в вашем RelativeLayout ложно:

android:clickable="false"

Просто убедитесь, что ваш RelativeLayout обрабатывает событие click в вашей активности. В моем коде я установил RelativeLayout к view v и установить onClick Listener на нем, чтобы справиться с CheckBox в моем элементе списка.

v.setOnClickListener(this);

Надеюсь, это поможет любому, кто его читает.

Выше ответы верны. но я хочу рекомендовать вместо этого использовать android: передний план, поскольку он показывает пульсацию перед imageView.

В вашем корневом представлении добавьте следующее.

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

Я знаю, что это довольно поздний ответ на такую ​​старую ветку. Но кто знает, кто-то может найти это полезным.

Другие вопросы по тегам