it-roy-ru.com

Эффект ряби на Android Lollipop CardView

Я пытаюсь заставить 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> 

Я относительно новичок в разработке Android, поэтому я мог сделать несколько очевидных ошибок.
Заранее спасибо.

135
AkraticCritic

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

Android:foreground="?android:attr/selectableItemBackground"
Android:clickable="true"
441
Jaden Gu

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

Android:clickable="true"
Android:foreground="?android:attr/selectableItemBackground"
24
Abdul Rizwan

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

<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 в отрисовываемом пакете код:

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

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

23
Rahul Ahuja

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

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

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

14
Developer Paul

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

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

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

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

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

clickable - Определяет, реагирует ли это представление на события щелчка. Должно быть логическим значением, «истина» или «ложь».

передний план - Определяет рисование поверх содержимого. Это можно использовать как наложение. Рисуемое на переднем плане участвует в заполнении содержимого, если гравитация установлена ​​для заполнения.

8
Filipe de Lima Brito

Для меня добавление 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>
3
Prabs

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

Ripple событие для 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" />
2
chavantr

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

Demo of Ripple on Galaxy S

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

1
Zielony

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

Android:foreground="?android:attr/selectableItemBackground"
Android:clickable="true"
1
Hitesh Kushwah

Для тех, кто ищет решение вопроса о том, что волновой эффект не работает с программно созданным 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
Breeno
  Android:foreground="?android:attr/selectableItemBackgroundBorderless"
   Android:clickable="true"
   Android:focusable="true"

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

0
Tarun Umath

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