Düğme arka plan rengiyle düğmeme dalgalanma efekti eklensin mi?


128

Bir düğme oluşturdum ve o düğmeye dalgalanma efekti eklemek istiyorum!

Bir düğme bg XML dosyası oluşturdum: (bg_btn.xml)

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient android:startColor="#FFFFFF" android:endColor="#00FF00" android:angle="270" />
<corners android:radius="3dp" />
<stroke android:width="5px" android:color="#000000" />
</shape>

Ve bu benim dalgalanma efekti dosyam: (ripple_bg.xml)

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:color="#f816a463"
    tools:targetApi="lollipop">
    <item android:id="@android:id/mask">
        <shape android:shape="rectangle">
            <solid android:color="#f816a463" />
        </shape>
    </item>
</ripple>

Ve bu benim dalgalanma efekti eklemek istediğim Düğmem:

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Button"
android:id="@+id/button"
android:layout_centerHorizontal="true"
android:layout_marginTop="173dp"
android:textColor="#fff"
android:background="@drawable/ripple_bg"
android:clickable="true" />

Ancak dalgalanma efekti ekledikten sonra düğme arka planı şeffaftır ve düğme yalnızca tıklandığında görüntülenir, örneğin:

Tıklamadan Önce

Tıklamada

Ancak hem düğme arka plan rengine hem de dalgalanma efektine ihtiyacım var, bu kodun bir kısmını Stack Overflow'un farklı bloglarında buldum, ancak yine de çalışmıyor!


lütfen bir dahaki sefere ekran görüntülerini çok daha küçük yapın .. (yüklemeden önce yeniden boyutlandırın)
kullanıcı25

@ user25, ayrıca resim bağlantısına bir lveya ekleyebilirsiniz m. (düzenlememe bakın)
Suragch

Yanıtlar:


157

İşte gradyan arka planını, köşe yarıçapını ve dalgalanma efektini hep birlikte eklemek isteyenler için başka bir çekilebilir xml:

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/colorPrimaryDark">
    <item android:id="@android:id/mask">
        <shape android:shape="rectangle">
            <solid android:color="@color/colorPrimaryDark" />
            <corners android:radius="@dimen/button_radius_large" />
        </shape>
    </item>

    <item android:id="@android:id/background">
        <shape android:shape="rectangle">
            <gradient
                android:angle="90"
                android:endColor="@color/colorPrimaryLight"
                android:startColor="@color/colorPrimary"
                android:type="linear" />
            <corners android:radius="@dimen/button_radius_large" />
        </shape>
    </item>
</ripple>

Bunu düğmenizin arka planına ekleyin.

<Button
    ...
    android:background="@drawable/button_background" />

Not: Bu cevap android api 21 ve üstü için çalışıyor.


4
@pei Bu bilgileri nereden alıyorsunuz? Demek istediğim, bu işi yapmak için ripple adında bir XML öğesi olduğunu nereden biliyorsunuz?

1
Materyal tasarımda kullanılan kavramlardan biridir. Lütfen Android Studio'da çekilebilir bir xml'de yeni bir kök etiketi yazmaya başlayın, ardından mevcut tüm etiketleri görebilmeniz gerekir ripple.
Pei

1
maske öğesinin kullanımı nedir?
Prashant

10
bu api seviye 21'i gerektirir
M.kazem Akhgary

2
işe yarıyor ama nasıl çalıştığı açıklanmadı. öğenin kimliği ile ilişkili olmalıdır. Başvurulmalıdır.
oiyio

157

Zaten bir arka planı varsa "?attr/selectableItemBackground"görünümünüzün android:foregroundözniteliğine ekleyin android:clickable="true".


her zaman işe yaramaz, ancak kabul edilen cevabın yorumlarında belirtildiği gibi dalgalanma efektine bir arka plan ekleyebilirsiniz
Tyler

Düğmem için özel bir arka plan kullandığım için bu çözümü kullanmak zorunda kaldım. Harika çalıştı.
bnayagrawal

@ROAR, bu doğru, ama en azından: "Bu bir hata değil; uygulama, özniteliği basitçe görmezden gelecektir. Ancak, öznitelik uygulamanızın görünümü veya işlevselliği için önemliyse, başarmak için alternatif bir yol bulmayı düşünmelisiniz. aynı sonucu yalnızca mevcut özniteliklerle elde edersiniz ve ardından isteğe bağlı olarak, yeni öznitelikten yararlanabileceğiniz API NN veya daha yüksek sürümlerde kullanılacak bir layout-vNN klasöründe düzenin bir kopyasını oluşturabilirsiniz. " Dolayısıyla, API 23'ün üzerindeki cihazlarda iyi çalışır ve aşağıda olduğunda göz ardı edilir (sadece yapabiliriz tools:ignore="UnusedAttribute).
JorgeAmVF

Android destek kitaplığı olmadan, ?android:attr/selectableItemBackground( android:attryerine attr)
Hafta sonu

1
android:foregroundözniteliğin 23'ten düşük API seviyelerine etkisi yoktur
Vadim Kotov

68

Android Düğmesine Dalgalanma Efekti / Animasyon Ekleme

Düğme arka plan özniteliğinizi android: background = "? Attr / selectableItemBackground" ile değiştirdiğinizde kodunuz şöyle görünür.

      <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/selectableItemBackground"
        android:text="New Button" />

Android Düğmesine Dalgalanma Efekti / Animasyon Eklemenin Başka Bir Yolu

Bu yöntemi kullanarak dalgalanma efekt rengini özelleştirebilirsiniz. İlk olarak, çekilebilir kaynak dizininizde bir xml dosyası oluşturmanız gerekir. Bir ripple_effect.xml dosyası oluşturun ve aşağıdaki kodu ekleyin. res / çekilebilir / ripple_effect.xml

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:color="#f816a463"
    tools:targetApi="lollipop">
    <item android:id="@android:id/mask">
        <shape android:shape="rectangle">
            <solid android:color="#f816a463" />
        </shape>
    </item>
</ripple>

Ve düğmenin arka planını çekilebilir kaynak dosyasının yukarısına ayarlayın

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/ripple_effect"
    android:padding="16dp"
    android:text="New Button" />

1
Benim için dalgalanma etkisi olmadı. sadece düğme için bir renk anahtarıydı: / Android sürümüm 5.1.1, yani çalışmalı. Yardım edebilir misin? Adımlarınızı takip ettim
UrviG

android: renk, direğe göre farklı olmalıdır android: renk veya dalgalanma efektini görmek istiyorsunuz
SpyZip

2
bir arka plan istiyorsanız, dalgaya başka bir öğe ekleyin, örneğin: <item android: drawable = "? attr / colorPrimary" />
Tyler

36

Jigar Patel'in çözümüne ek olarak , düğmelerin saydam arka planını önlemek için bunu ripple.xml'ye ekleyin .

<item
    android:id="@android:id/background"
    android:drawable="@color/your-color" />

Tam xml :

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:color="@color/your-color"
    tools:targetApi="lollipop">
    <item android:id="@android:id/mask">
        <shape android:shape="rectangle">
            <solid android:color="@color/your-color" />
        </shape>
    </item>
    <item
        android:id="@android:id/background"
        android:drawable="@color/your-color" />
</ripple>

Bu ripple.xml dosyasını düğmenizde arka plan olarak kullanın :

android:background="@drawable/ripple"

2
Kullanmamıza gerek yoktu <item android:id="@android:id/mask"> [...]. Oval bir maske istemiyorsan tabii. Cevabınız için teşekkürler!
Filipe Brito

Bu <item android: id = "@ android: id / mask"> her
halükarda ne yapıyor

Resmi belgelerden @SartherisStormhammer: Bir maske katmanı ayarlanmışsa, dalgalanma efekti kalan alt katmanların bileşimi üzerine çizilmeden önce bu katmana karşı maskelenir. Maske katmanı ayarlanmadıysa, dalgalanma efekti alt katmanların bileşiğine karşı maskelenir. Bu bağlantı, developer.android.com/reference/android/graphics/drawable/…
Sudheesh R

@SudheeshR, işi daha da kafa karıştırıcı hale getiriyor
Sartheris Stormhammer

@SartherisStormhammer Bu resmi belgeden oldukça açık olduğunu düşünüyorum. Dalgalanma efekti, alt / maskeli katmanların üzerine çizer. Lütfen dokümanı tekrar okuyun, noktayı alacaksınız.
Sudheesh R

33

Düğmenin çekilebilirden bir arka planı olduğunda, ön plan parametresine dalgalanma efekti ekleyebiliriz .. Aşağıdaki kodu kontrol edin, düğmem için farklı bir arka planla çalıştığını kontrol edin

    <Button
    android:layout_width="wrap_content"
    android:layout_height="40dp"
    android:gravity="center"
    android:layout_centerHorizontal="true"                                                             
    android:background="@drawable/shape_login_button"
    android:foreground="?attr/selectableItemBackgroundBorderless"
    android:clickable="true"
    android:text="@string/action_button_login"
     />

Dalgalanma etkisi için aşağıdaki parametreyi ekleyin

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

Referans için aşağıdaki bağlantıya bakın https://jascode.wordpress.com/2017/11/11/how-to-add-ripple-effect-to-an-android-app/


2
Özellik android: Ön plan API düzeyleri üzerinde hiçbir etkisi yoktur 23 daha düşük
Ali Haki

1
Bu yaklaşımın bir dezavantajı, düğme arka planım oval olmasına rağmen dalgalanmanın dikdörtgen kenarlara kadar yayılmasıdır.
iCantC

14

AppCompat v7 +

Ön ek yapmazsanız ?android:uygulamanız kilitlenir.

Tercihinize göre "?android:attr/selectableItemBackground"veya kullanmalısınız "?android:attr/selectableItemBackgroundBorderless". Tercih ederim Borderless.

Mevcut mülklerin içine koyabilir android:backgroundveya android:foregroundmuhafaza edebilirsiniz.

Bunun çalışması için öğenin android:clickable="true"ve öğesinin olması gerekir android:focusable="true", ancak düğmeler gibi birçok öğe truevarsayılan olarak bunlara sahiptir .

<Button
    ...
    android:background="@color/white"
    android:foreground="?android:attr/selectableItemBackgroundBorderless"
/>
<TextView
    ...
    android:background="?android:attr/selectableItemBackgroundBorderless"
    android:clickable="true"
    android:focusable="true"
/>

Programlı olarak (Java)

TypedValue value = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, value, true);
myView.setBackgroundResource(value.resourceId);
myView.setFocusable(true); // If needed for view type

Programlı olarak (Kotlin)

val value = TypedValue()
context.theme.resolveAttribute(android.R.attr.selectableItemBackground, value, true)
myView.setBackgroundResource(value.resourceId)
myView.setFocusable(true) // If needed for view type

Yeniden Kullanılabilir Kotlin Genişletme İşlevi

myView.ripple()

fun View.ripple(): View {
    val value = TypedValue()
    context.theme.resolveAttribute(android.R.attr.selectableItemBackground, value, true)
    setBackgroundResource(value.resourceId)
    isFocusable = true // Required for some view types
    return this
}

7

Ön plan ve tıklanabilir özellikler eklemek benim için çalıştı.

<Button
    ... 
    android:background="@color/your_color"
    android:foreground="?attr/selectableItemBackgroundBorderless"
    android:clickable="true" />

6

Sudheesh R'ye ek olarak

Köşeli düğme dikdörtgen şeklinde bir Android Düğmesine Dalgalanma Efekti / Animasyon ekleyin

Res / drawable / your_file_name.xml xml dosyası oluşturun

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:color="@color/colorWhite"
    tools:targetApi="lollipop">
    <item android:id="@android:id/mask">
        <shape android:shape="rectangle">
            <solid android:color="@color/colorPrimaryDark" />
            <corners android:radius="50dp" />
        </shape>
    </item>

    <item android:id="@android:id/background">
        <shape android:shape="rectangle">
            <gradient
                android:angle="90"
                android:endColor="@color/colorAccent"
                android:startColor="@color/colorPrimary"
                android:type="linear" />
            <corners android:radius="50dp" />
        </shape>
    </item>
</ripple>

4

Android: background kullandığınızda, bir düğmenin stilini ve görünümünü ve hissini boş bir renkle değiştiriyorsunuz.

Güncelleme: AppCompat'ın 23.0.0 sürümünden itibaren yeni bir Widget.AppCompat.Button var. Devre dışı bırakılan renk için temanızın colorButtonNormal ve etkinleştirilmiş renk için colorAccent kullanan bir renkli stil.

Bu, doğrudan düğmenize uygulamanıza izin verir.

<Button
 ...
style="@style/Widget.AppCompat.Button.Colored" />

V21 dizininizde arka planınız için bir çizim kullanabilirsiniz, örneğin:

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?attr/colorControlHighlight">
<item android:drawable="?attr/colorPrimary"/>
</ripple>

Bu, arka plan renginizin? Attr / colorPrimary olmasını ve varsayılan? Attr / colorControlHighlight (isterseniz temanızda da ayarlayabilirsiniz) kullanarak varsayılan dalgalanma animasyonuna sahip olmasını sağlar.

Not: v21'den daha düşük bir fiyata özel bir seçici oluşturmanız gerekir:

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

minSDK lvl 21 kullanarak im
rakcode

v21 çekilebilir klasörü yok, yalnızca bir klasör o klasörün kendisi v21 klasörü
rakcode

evet, bu API'yi de kullandım, eğer bu API'yi uygulamam kilitlendikten sonra kullanırsam
rakcode

aslında, uygulamamı telefonumda hata ayıklama modu ile test ediyorum ve işletim
sistemim

4

bunu dene

<Button
            android:id="@+id/btn_location"
            android:layout_width="121dp"
            android:layout_height="38dp"
            android:layout_gravity="center"
            android:layout_marginBottom="24dp"
            android:layout_marginTop="24dp"
            android:foreground="?attr/selectableItemBackgroundBorderless"
            android:clickable="true"
            android:background="@drawable/btn_corner"
            android:gravity="center_vertical|center_horizontal"
            android:paddingLeft="13dp"
            android:paddingRight="13dp"
            android:text="Save"
            android:textColor="@color/color_white" />

4

Basit bir yaklaşım, burada ana hatlarıyla 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>

3

Sadece kullan :

android:backgroundTint="#f816a463"

Onun yerine:

android:background="#f816a463"

Senin değiştirmek unutmayın ButtonToandroid.support.v7.widget.AppCompatButton


1
Kötü olan, yatay ekranı% 100 doldurmak için bir düğmeye ihtiyacınız varsa, bunu yapmayacağınızdır.
Filipe Brito

1

<ripple>Etiketi kullanmanın alternatif bir çözümü (renkler "varsayılan" olmadığı için şahsen bunu yapmayı tercih etmiyorum) şudur:

Düğme arka planı için bir çekilebilir öğe oluşturun <item android:drawable="?attr/selectableItemBackground">ve<layer-list>

Sonra (ve bunun önemli olduğunu düşünüyorum) backgroundResource(R.drawable.custom_button)düğme örneğinizde programlı olarak ayarlayın .

Etkinlik / Fragment

Button btn_temp = view.findViewById(R.id.btn_temp);
btn_temp.setBackgroundResource(R.drawable.custom_button);

Yerleşim

<Button
    android:id="@+id/btn_temp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/custom_button"
    android:text="Test" />

custom_button.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@android:color/white" />
            <corners android:radius="10dp" />
        </shape>
    </item>
    <item android:drawable="?attr/selectableItemBackground" />
</layer-list>

Layout xml Button'ın arka planını tanımlarken neden programlı olarak backgroundResource'u yeniden ayarlamalı?
SunnyShiny9
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.