Эффект пульсации на Android Lollipop CardView

Я пытаюсь получить CardView для отображения эффекта пульсации при касании, установив атрибут android: backgound в файле XML активности, как описано здесь на странице Android Developers, но он не работает. Нет анимации вообще, но метод в onClick вызывается. Я также попытался создать файл ripple.xml, как предлагалось здесь, но тот же результат.

CardView, как он отображается в файле XML активности:

<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, поэтому я мог бы сделать несколько очевидных ошибок.
Спасибо заранее.

Ответ 1

Вы должны добавить следующее в CardView:

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

Ответ 2

Добавьте эти два кода строки в свой вид xml, чтобы дать эффект пульсации на вашем карточном экране.

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

Ответ 3

Мне удалось получить эффект пульсации на карте:

<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, который вы видите в приведенном выше коде, вы должны определить xml файл как для lollipop (в пакете drawable-v21), так и для pre-lollipop (в переносном пакете). для custom_bg в пакете drawable-v21 код:

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

для 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>

поэтому на устройствах с предварительным лепестком у вас будет сильный эффект щелчка, а на устройствах с леденец у вас будет эффект пульсации на карте.

Ответ 4

Эффект пульсации был опущен в библиотеке поддержки appcompat, которую вы используете. Если вы хотите увидеть пульсацию, используйте версию Android L и протестируйте ее на устройстве Android L. На сайт AppCompat v7:

"Почему на до-Lollipop нет пульсаций? Многое из того, что позволяет RippleDrawable работать бесперебойно, - это новый RenderThread от Android 5.0. Чтобы оптимизировать производительность на предыдущих версиях Android, мы оставили RippleDrawable на данный момент ".

Посмотрите эту ссылку здесь для получения дополнительной информации

Ответ 5

Если приложение minSdkVersion, которым вы работаете, является уровнем 9, вы можете использовать:

android:foreground="?selectableItemBackground"
android:clickable="true"

Вместо этого, начиная с уровня 11, вы используете:

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

Из документации:

clickable - определяет, реагирует ли это представление на события кликов. Должно быть логическое значение, либо "true", либо "false".

foreground - определяет возможность рисования по содержимому. Это можно использовать в качестве наложения. Выделенный передний план участвует в заполнении содержимого, если гравитация задана для заполнения.

Ответ 6

Для меня добавление foreground в CardView не срабатывало (причина неизвестна:/)

Добавление же к нему дочернего макета сделало трюк.

CODE:

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

Ответ 7

Пульсация событие для 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" />

Ответ 8

Если есть корневой макет, такой как RelativeLayout или LinearLayout, который содержит весь компонент элемента адаптера в 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"
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>

Ответ 9

Я не был доволен AppCompat, поэтому я написал свой собственный CardView и порожденную волнами. Здесь он работает на Galaxy S с Gingerbread, так что это определенно возможно.

Demo of Ripple on Galaxy S

Для более подробной информации проверьте исходный код.

Ответ 10

Добавьте эти два типа кода, работающего как очарование для любого представления, такого как Button, Linear Layout или CardView. Просто поместите эти две строки и увидите магию...

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

Ответ 11

Для тех, кто ищет решение проблемы эффекта пульсации, не работающей на программно созданный CardView (или в моем случае пользовательский вид, который расширяет CardView), отображаемый в RecyclerView, для меня работало. В основном декларирование атрибутов 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.

Ответ 12

  android:foreground="?android:attr/selectableItemBackgroundBorderless"
   android:clickable="true"
   android:focusable="true"

Только работает API 21 и использовать это не использовать этот список строк просмотра карты

Ответ 13

Добавьте следующее в ваш 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)
        }
    }