Ефект Ripple на Android Lollipop CardView


191

Я намагаюся отримати CardView для відображення ефекту пульсації при дотику, встановивши атрибут android: backgound у файлі XML активності, як описано тут, на сторінці розробників Android, але він не працює. Анімації взагалі немає, але метод в 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> 

Я відносно новачок в розробці андроїдів, тому, можливо, я зробив кілька очевидних помилок.

Відповіді:


593

Ви повинні додати наступне CardView:

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

8
Працює на льодянику з ефектом пульсації, але лише надає міцного кольору під час роботи на старих платформах. Досить добре для мене :)
мак

16
Невелике зауваження: я зазначив, що атрибут, що можна натискати, не потрібен і навіть може порушити деякі речі! У мене був GridView, наповнений CardViews, які можна натиснути, і слухач не працював належним чином. Я видалив тег, який можна натиснути з XML, і все зараз працює бездоганно
Хоакін Юрчук,

2
@joaquin без натискання, це призводить до того, що пульсація походить лише від центру
frostymarvelous

2
?android:attr/selectableItemBackgroundвимагає рівня API 11
Пратік Бутані

9
Працюючи без android:clickable="true".
Шон

30

Додайте ці два коду рядка у свій xml-вигляд, щоб надати ефект пульсації на вашій картці View.

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

Дивовижно! foregroundпрацює із спеціальними фоновими поданнями, як шарм Приємно!
sud007

24

Мені вдалося отримати ефект пульсації на перегляді карт:

<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 як для льодяника (у пакеті dravable-v21), так і для попереднього льодяника (у пакеті, що перетягується). для custom_bg в пакеті dravable-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>

для користувальницьких_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>

тож на пристроях, що попередньо льодяник, ви матимете міцний ефект клацання, а на пристроях льодяника - ефект пульсації на перегляді карти.


1
Привіт, Я розумію, застосовуючи селектор (або пульсацію) на передньому плані CardView, він буде блокувати дитина в самому CardView - stackoverflow.com/questions/33763403 / ... Можу чи я знаю , ви зіткнулися з тим же Prob , як я зробив? Або я щось пропускаю? Дякую.
Чак Ян Чен

@CheokYanCheng: Я не стикаюся з такою проблемою, як ваша, але з особистого досвіду я б сказав, що cardView має деякі помилки для попередньої льодяниці. Уникайте використання перегляду карт: властивість висоти в попередньому льодянику. Вищезазначене працює добре для мене та інших прихильників.
Рахул Ахуджа

Чи можу я знати, яка цінність вашого кольорового світла та навігаційного_драверного_зад. Якщо ви використовували власний визначений колір без прозорості, чи все ще можете бачити дітей своєї картки?
Чак Ян Чен

@CheokYanCheng: значення є такими, <color name = "navigation_drawer_background"> ​​# FFFFFF </color> <color name = "colorHighlight"> # FF8A65 </color>
Рахул Ахуджа

Я не працюю у своїй справі. Я використовую ваш селектор як передній план. Як очікується, суцільний білий колір (navigation_drawer_background), який використовується як передній план карти, блокує видимість усіх дітей - i.imgur.com/CleYh5B.png Так виглядає, не застосовуючи селектор як передній план - i.imgur. com / ZXk5Aoq.png
Cheok Yan Cheng

14

Ефект пульсації був опущений у бібліотеці підтримки appcompat, яку ви використовуєте. Якщо ви хочете бачити пульсацію, використовуйте версію Android L і протестуйте її на пристрої Android L. На сайті AppCompat v7:

"Чому на Pre-Lollipop немає пульсацій? Багато того, що дозволяє RippleDravable безперебійно працювати, - це новий RenderThread для Android 5.0. Щоб оптимізувати продуктивність на попередніх версіях Android, поки що RippleDravable ми покинули."

Ознайомтесь з цим посиланням тут для отримання додаткової інформації


Це було б все. Дякую!
AkraticCritic

39
Але як би ви поставили ефект пульсації на cardView для Android Lollipop?
андроїд розробник

Тож я повинен вирішити між зворотною сумісністю за допомогою appcompat або мати всі нові ефекти, використовуючи класи з ядра Android, але обмежуючи себе API 21?
Urs Reupke

Ви можете зробити 2 APK для одного 21+, а іншого для <21. Або розділити код, оскільки 21+ не буде використовувати панель supportAction і т. Д. Можливо, це здасться великою проблемою, але я вважаю, що це ваш роздум.
Mathijs Segers

1
Ось чому написання «чистих» додатків для Android L наразі не під силу. З липня 2015 року ви будете орієнтовані на 12% бази користувачів Android.
Гленн Бех

10

Якщо додаток, minSdkVersionяким ви працюєте, є рівень 9, ви можете використовувати:

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

Натомість, починаючи з 11 рівня, ви використовуєте:

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

З документації:

Клікабельний - визначає, чи реагує цей погляд на події натискання. Повинно бути булевим значенням, або "істинним", або "хибним".

передній план - визначає графічний контент для малювання вмісту. Це можна використовувати як накладку. Передній план, який можна малювати, бере участь у прокладці вмісту, якщо сила тяжіння встановлена ​​для заповнення.


Використання android: foreground = "? Android: attr / selectableItemBackground" працювало на сумісність AndroidX, дякую!
dianakarenms

6

Для мене, додавання foregroundдо 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>

2
Це тому, що дитина перехоплює подію, якщо ви спробуєте щось на зразок додавання накладки до перегляду карти (щось на зразок 20dp), і ви натискаєте ту частину, де буде прокладка, тоді ви побачите ефект пульсації навіть без дитини набір атрибутів переднього плану
Cruces

1
Це працювало і для мене, використовуючи нові Матеріальні компоненти: com.google.android.material.card.MaterialCardView. У мене був стан висотиListAnimator для перегляду карти для регулювання висоти та пульсації, застосованої до внутрішнього макета обмеження з вибираючим фоном елемента на передньому плані без атрибута, що можна натискати.
Патті П

Я цього не пам’ятаю зараз, але є спосіб встановити дитячі погляди не реагувати на подію натискання
Хтось десь

3

Додайте ці два кодові роботи як шарм для будь-якого виду, як кнопка, лінійний макет або CardView. Просто поставте ці два рядки і побачите магію ...

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

2

Якщо в кореневому макеті є кореневий макет типу RelativeLayout або LinearLayout, який містить весь компонент адаптера, ви повинні встановити фоновий атрибут. подібно до:

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

2

Подія Ripple для Cardviewуправління Android :

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

1

Я не був задоволений AppCompat, тому написав власний CardView та підтримував брижі. Ось він працює на Galaxy S з пряниками, так що це, безумовно, можливо.

Демонстрація Ripple на Galaxy S

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


посилання розірвано
temirbek

1

Додайте до 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)
        }
    }

0

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


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

Лише працює api 21 і використовувати це, не використовувати цей перегляд рядка карт списку


0

Натомість використовуйте Material Cardview, він розширює Cardview і надає безліч нових функцій, включаючи ефект, що можна натискати за замовчуванням:

<com.google.android.material.card.MaterialCardView>

...

</com.google.android.material.card.MaterialCardView>

Залежність

implementation 'com.google.android.material:material:1.0.0'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.