Recycler'a Dalgalanma Efekti Ekleme


108

RecyclerView'ın öğesine Ripple Effect eklemeye çalışıyorum. İnternete baktım ama ihtiyacım olanı bulamadım. Bunun özel bir efekt olması gerektiğini varsayıyorum. RecyclerView'ın kendisine ait android: background özniteliğini denedim ve bunu "? Android: selectableItemBackground" olarak ayarladım ama işe yaramadı .:

    <android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:focusable="true"
    android:clickable="true"
    android:background="?android:selectableItemBackground"
    android:id="@+id/recyclerView"
    android:layout_below="@+id/tool_bar"/>

Bu, efekti eklemeye çalıştığım RecyclerView:

görüntü açıklamasını buraya girin


1
Bu sorunun kopyası olmadığı için bunu yeniden açıyorum . Çözümler benzer olsa da CardView, bu soruda a'ya sahip olmanın, bu daha genel soru ile ilgili olmayan bazı yönleri vardır .
Suragch

@Suragch Farkı fark ettiğiniz için teşekkürler :)
Georgi Koemdzhiev

Yanıtlar:


225

Ben anladım. Yapmam gereken tek şey şu özelliği eklemek:

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

RecyclerView bağdaştırıcımın şu şekilde şişirdiği düzenin kök öğesine:

<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:paddingTop="8dp"
    android:paddingBottom="8dp"
    android:background="?android:attr/selectableItemBackground"
    tools:background="@drawable/bg_gradient">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="17sp"
        android:layout_marginLeft="15dp"
        android:layout_marginStart="15dp"
        android:id="@+id/shoppingListItem"
        android:hint="@string/enter_item_hint"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"/>

    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/shopping_list_item_checkbox_label"
        android:id="@+id/shoppingListCheckBox"
        android:layout_centerVertical="true"
        android:layout_marginRight="15dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:checked="false"/>

</RelativeLayout>

Sonuç:

görüntü açıklamasını buraya girin

Hala dalgalanma etkisini göremiyorsanız, bu çizgileri aynı zamanda mizanpajın kök öğesine de ekleyin.

android:clickable="true"
android:focusable="true"

3
Ya kök öğe CardView ise?
Nabin

7
@SpiderMan Kodunuzu bir Göreceli veya Doğrusal Düzen içine yazmalı ve ardından Kart Düzeninin içine yerleştirmelisiniz.
SanVed

7
@pronoobsanved, bu bana yardımcı oldu! Hala sorunla karşı karşıya olanlar için, CardView çocukken tek bir düzen alır. Bu çocuk için tıklanabilir, odaklanabilir gerçek ve arka planı? Attr / selectedableItemBackground
Vamsi Challa

42
CardView için @NabinKhadka bunu ön plan olarak ayarladı, yaniandroid:foreground="?android:attr/selectableItemBackground"
Lorne Laliberte

6
android:clickable="true"Bu işi yapmak için seçeneği de
eklemem

71

Daha önce yanıtlandığı gibi, en basit çözüm aşağıdakilerden birini RecyclerViewsatırınızın arka planı olarak eklemektir :

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

Ancak bu yöntemle ilgili sorunlar yaşıyorsanız veya renkler üzerinde daha iyi kontrol istiyorsanız, aşağıdakileri yapabilirsiniz.

Özel Dalgalanma Etkisi

Bu cevap, bu basit Android RecyclerView örneğiyle başlıyor . Aşağıdaki resme benzeyecek.

Dalgalanma efekti örneği GIF

API 21 öncesi cihazlar için seçici ekleyin

API 21'den (Android 5.0 Lollipop) önce, bir RecyclerViewöğeye tıklamak , arka plan rengini değiştiriyordu (dalgalanma etkisi yok). Biz de bunu yapacağız. Hala bu cihazlara sahip kullanıcılarınız varsa, bu davranışa alışmışlardır, bu yüzden onlar için çok fazla endişelenmeyeceğiz. (Tabii ki onlar için de dalgalanma efektini gerçekten istiyorsanız, özel bir kitaplık kullanabilirsiniz .)

res/drawableKlasörünüzü sağ tıklayın ve Yeni> Çekilebilir kaynak dosyası'nı seçin . Bunu aramakcustom_ripple . Tamam'ı tıklayın ve aşağıdaki kodu yapıştırın.

custom_ripple.xml

<?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/colorAccent" />
        </shape>
    </item>
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>
</selector>

colorAccentBasılmış durum için vurgu rengi olarak kullandım çünkü zaten mevcuttu, ancak istediğiniz rengi tanımlayabilirsiniz.

API 21+ cihazlar için Ripple Effect ekleyin

res/drawableKlasörünüzü sağ tıklayın ve Yeni> Çekilebilir kaynak dosyası'nı seçin . Diyelim custom_rippleyine. Yine de bu sefer Tamam'ı tıklamayın. Gönderen Mevcut eleme listesi seçim Sürüm , ardından >> düğmesini ve yazma 21için Platform API düzeyinde . Şimdi Tamam'ı tıklayın ve aşağıdaki kodu yapıştırın.

v21 / custom_ripple.xml

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/colorAccent">

    <item
        android:id="@android:id/mask"
        android:drawable="@android:color/white" />
</ripple>

Yine colorAccentdalgalanma rengi için kullandım çünkü mevcuttu, ancak istediğiniz rengi kullanabilirsiniz. Maske, dalgalanma efektini yalnızca satır düzeniyle sınırlar. Görünüşe göre maske rengi önemli değil bu yüzden sadece opak bir beyaz kullandım.

Arka plan olarak ayarla

RecyclerView öğenizin kök düzeninde, arka planı oluşturduğumuz özel dalgalanmaya ayarlayın.

android:background="@drawable/custom_ripple"

Başladığımız örnek projede şöyle görünüyor:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:background="@drawable/custom_ripple"
    android:padding="10dp">

    <TextView
        android:id="@+id/tvAnimalName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"/>

</LinearLayout>

Bitti

Bu kadar. Şimdi projenizi çalıştırabilmelisiniz. Bu cevaba ve yardım için bu YouTube videosuna teşekkürler .


Varsayılan bir arka plan rengine sahip olmak istiyorsanız, sadece 'android: id = "@ android: id / mask' satırını kaldırın ve ardından çizilebilirin rengini istediğiniz gibi ayarlayın.
Jordan Hochstetler

26

Bence gözden kaçan küçük bir ayrıntı var.

Ekledikten sonra hala dalgalanma efektini alamıyorsanız, android:background="?android:attr/selectableItemBackground"aşağıdaki satırları mizanpajın köküne eklemeyi deneyin.

android:clickable="true"
android:focusable="true"

Bunlar, görünümün tıklanabilir olmasını sağlar ve yukarıda bahsedilen arka plan özelliği ile dalgalanma efektini etkinleştirir.


5

bu satırları adaptör xml kök görünümünüze ekleyin

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

2

Basit ve özel bir yaklaşım, burada belirtildiği gibi bir görünüm teması belirlemektir .

some_view.xml

<ImageView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:background="?attr/selectableItemBackgroundBorderless"
   android:focusable="true"
   android:src="@drawable/up_arrow"
   android:theme="@style/SomeButtonTheme"/>

some_style.xml

<style name="SomeButtonTheme" >
   <item name="colorControlHighlight">@color/someColor</item>
</style>

Diğer özel uygulamalar burada bulunabilir .


1

Bir Düğme Stili Kullanma

Bu benim için sayısız çalıştı.

Kenarlıksız Düğme Stilini mizanpajınızın kök öğesine ekleyin. Orada gerek var focusableya clickablevarsayılan stil sizin için tüm bu kapsüller, bağlıyor.

<androidx.constraintlayout.widget.ConstraintLayout
    style="@android:style/Widget.Material.Button.Borderless"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

@ededede Min-height, max-height, width ... XML özelliklerini kendi zevkinize göre ayarlamak için kullanabilirsiniz.
Felix Favor Chinemerem
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.