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


Я пытаюсь получить CardView для отображения эффекта пульсации при прикосновении, установив атрибут android: backgound в XML-файле activity, как описано здесь на странице разработчиков Android, но это не работает. Нет анимации вообще, но метод в onClick называется. Я также попытался создать рябь.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, поэтому я, возможно, сделал несколько очевидных ошибок.
Спасибо заранее.

12 118

12 ответов:

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

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

мне удалось получить эффект пульсации на cardview с помощью:

<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(в пакете drawable). для 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 в пакете drawable код:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Если есть корневой макет, такой как 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>

для меня, добавив элемент foreground to 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"
    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>

добавить эти два типа кода работают как шарм для любого вида, как кнопка, линейный макет или CardView просто поместите эти две строки и увидеть магию...

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

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

Demo of Ripple on Galaxy S

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

пульсация событие для android Cardview control:

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

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

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

только рабочий api 21 и использовать это не использовать этот список вид строки карты