Bir düğme tıklandığında üzerinde dairesel bir dalgalanma nasıl yapılır?


121

Arka fon

Android'in çevirici uygulamasında, bir şeyi aramaya başladığınızda ve EditText'in solundaki ok düğmesini tıkladığınızda, üzerinde dairesel bir dalgalanma efekti elde edersiniz:

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

Sorun

Ben de almayı denedim, ama bende dikdörtgen bir tane var:

    <ImageButton
        android:id="@+id/navButton"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="8dp"
        android:background="?android:attr/selectableItemBackground"
        android:src="@drawable/search_ic_back_arrow"/>

Soru

Düğmenin tıklandığında dairesel bir dalgalanma etkisi olmasını nasıl sağlayabilirim? Yeni bir çekilebilir öğe oluşturmam gerekiyor mu yoksa bunun için yerleşik bir yol var mı?




1
Sorunu gerçekten çözdüğü için, seçtiğiniz cevabı en çok oy alan cevapla değiştirmeyi düşünün
Jeff Barger

@JeffBarger Neden? İkisi de iyi çalışıyor. Aralarında daha iyisi yok.
android geliştiricisi

Yanıtlar:


18

Zaten bir arka plan resminiz varsa, aşağıda selectableItemBackgroundBorderless'a yakın görünen bir dalgalanma örneği verilmiştir:

            <ImageButton
                android:id="@+id/btn_show_filter_dialog"
                android:layout_width="24dp"
                android:layout_height="24dp"
                android:background="@drawable/ic_filter_state"/>

ic_filter_state.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_pressed="true"
        android:state_enabled="true"
        android:drawable="@drawable/state_pressed_ripple"/>
    <item
        android:state_enabled="true"
        android:drawable="@drawable/ic_filter" />
</selector>

state_pressed_ripple.xml: (beyaz arka planda opaklık% 10'a ayarlandı) 1AFFFFFF

 <?xml version="1.0" encoding="UTF-8"?>    
    <ripple xmlns:android="http://schemas.android.com/apk/res/android">
        <item>
            <shape android:shape="oval">
                <solid android:color="#1AFFFFFF"/>
            </shape>
            <color android:color="#FFF"/>
        </item>
    </ripple>

289

AppCompat temasını kullanıyorsanız, görünümün arka planını şu şekilde ayarlayabilirsiniz:

android:background="?selectableItemBackgroundBorderless"

Bu, 21 ve üzerinde dairesel dalgalanma ve 21'in altında kare arka plan ekleyecektir.


Güzel. Bir şekilde rengini de ayarlayabilir miyim?
android geliştiricisi

4
API 23'te 'yukarı' arka plan, selectbleItemBackgroundBorderless ile karşılaştırıldığında yarı boyutta görünüyor
snodnipper

3
Güzel, en iyi cevap. ty
Skywalker

1
@androiddeveloper, renk, styles.xml <item name = "colorControlHighlight"> # F00 </item>
bond

4
Diğer düzenlerde kullanıyorsanız android:clipChildren="false", animasyonun yayılmasına izin vermek için mizanpajlarda da ihtiyacınız olabilir .
Tanasis

83

Özellikle hareket çubuğu için yuvarlak dalgalanma efektine sahip başka bir özellik:

android:background="?actionBarItemBackground"

UPD : Dalgalanma rengi şu öznitelikle değiştirilebilir:

<!--somewhere in styles-->
<item name="colorControlHighlight">your_color_here</item>

Ancak, bu özelliğin tüm varsayılan dalga efektleri için geçerli olduğunu unutmayın.


Özelleştirmenin bir yolu var mı? Örneğin renk? Belki stillerde bir şey? Ya da daha spesifik olarak XML görünüm etiketinin kendisinde mi?
android geliştiricisi

Bilmiyorum, bugün bu sorunu çözdüm ve yukarıdaki cevaplar ihtiyacım olduğu gibi işe yaramadı. Rengin stillerde özelleştirilebileceğini varsayıyorum, ancak kesinlikle görünümde değil.
Anrimian

1
Bu tam olarak aradığım doğru etki. Bu arada, bu niteliğin nerede bulunacağından bahsedebilir misiniz, belgelenmemiş gibi görünüyor.
Jack Wang

2
OP sorusunu yanıtlar. En iyi cevap olarak işaretlenmelidir. +1
Corbella

2
@MeysamHadigheh ?kısayol?attr/
musooff

47

Arka plan olarak bir dalgalanma çekilebilir oluşturun ve ayarlayın. Bunun gibi bir şey.

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/grey_15">
    <item android:id="@android:id/mask">
        <shape android:shape="oval">
            <solid android:color="?android:colorPrimary"/>
        </shape>
        <color android:color="@color/white"/>
    </item>
</ripple>

Kodumda bir şey var. Renklerinizi kullanabilirsiniz :)
Thomas R.

Lollipop öncesi durumda olması durumunda varsayılan seçiciyi nasıl kullanırım? Ayrıca, çeviricideki ile aynı renkleri kullanıyor mu?
android geliştiricisi

2
Ripple çekmecesini drawables-v21 klasörünüze koyabilirsiniz. Ve pre L için basit bir çekilebilir durum kullanın. Aynı dosya adını kullanın ve onu çekilebilir (varsayılan) klasöre koyun.
Thomas R.

2
Ayrıca bir stil de oluşturabilirsiniz. Değerler-v21 klasöründe yeni bir stil oluşturun ve dalgalanma çekilebilirini arka plan olarak ayarlayın. Ve pre L için, yani değerler klasörünüzde styles.xml arka plan olarak aynı stil için "selectableItemBackground" özelliğini koyun.
Thomas R.

1
Uygulamada kullanılan diğer varsayılan dalga efektleriyle aynı dalgalanma rengini istiyorsanız, renk olarak "? Attr / colorControlHighlight" kullanın.
alexbchr

27

Sadece bu arka planı görünümünüze ekleyin

android:background=?android:attr/actionBarItemBackground


19

Xml'deki android:radiusözniteliği kullanarak daire dalgası çekilebilirliği oluşturabilirsiniz .

Misal:

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="your_color"
    android:radius="your_radius" />

your_radiusGörüş genişliğinizden ve yüksekliğinizden daha az olması gerektiğine dikkat edin . Örneğin: boyuta sahip görünümünüz varsa 60dp x 60dp your_radiusyakın olmalıdır 30dp(genişlik / 2 veya yükseklik / 2).

Android 5.0 ve sonraki sürümlerde çalışın.


3

Daha fazla genel XML dosyası istiyorsanız, iki dosyam var:

1) btn_ripple_background kodu ile:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
    android:state_pressed="true"
    android:state_enabled="true"
    android:drawable="@drawable/ripple_circular_shape"/>
</selector>

2) ripple_circuler_shape kodu ile:

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

son olarak kullanım:android:foreground="@drawable/ripple_btn_background"


2

Daire sınırını geçmeyecek dalgalanma efekti istiyorsanız, bu kodu kontrol edebilirsiniz. Benim için mükemmel çalışıyor. Ripple_blue.xml'de id = @ android: id / mask vermeniz gerektiğini unutmayın.

<ImageButton
    android:id="@+id/send_password_to_mail_image_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/ripple_blue"
    android:src="@drawable/ic_filter" />

ripple_blue.xml

<ripple
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/colorRipple">

    <item android:id="@android:id/mask">

        <shape android:shape="oval">
            <solid android:color="@color/colorWindowBackground"/>
        </shape>

    </item>

    <item android:id="@android:id/background">

        <shape android:shape="oval">
            <solid android:color="@color/colorWindowBackground"/>
        </shape>

    </item>

</ripple>

color.xml

<resources xmlns:tools="http://schemas.android.com/tools">
    <color name="colorWindowBackground">#F2F5FC</color>
    <color name="colorRipple">#0288d1</color>
</resources>

1

Deneyin:

android:background="@android:color/transparent"
android:clickable="true"
android:focusable="true"
android:foreground="?actionBarItemBackground"

1
Lütfen yanıt olarak yalnızca kod göndermeyin, kodunuzun ne yaptığını ve sorunun sorununu nasıl çözdüğünü açıklayın. Açıklamalı yanıtlar genellikle daha kalitelidir ve olumlu oylar alma olasılığı daha yüksektir.
Mark Rotteveel

ActionBarItemBackground'u arka plan olarak ayarlamaktan daha pürüzsüz. Ancak yine de eylem çubuğu animasyonunun kendisiyle tam olarak aynı değil.
coolcool1994


0

Kotlin / Java'da aşağıdakileri yapabilirsiniz

fun View.applyCircularRippleEffect() {
    val backgroundResId = context.getResource(android.R.attr.actionBarItemBackground)

    if (backgroundResId != 0) {
        setBackgroundResource(backgroundResId)
        isClickable = true
        isFocusable = true
    }
}

// getResource extension
fun Context.getResource(resourceId: Int): Int {
    val out = TypedValue()
    theme.resolveAttribute(resourceId, out, true)

    return out.resourceId
}

context.getResource bulunamadı
Rahul Mandaliya

@RahulMandaliya yorum için teşekkür ederim. Benim hatam, bu benim özel uzatma yöntemimdi.
Cevaba
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.