Android Materyal Tasarımı Düğme Stilleri


308

Malzeme tasarımı için düğme stilleri kafam karıştı. Ekli bağlantıdaki gibi renkli yükseltilmiş düğmeler almak istiyorum. Kullanım bölümü altında görülen "zorla durdur" ve "kaldır" düğmeleri gibi. Kullanılabilir stiller var mı veya bunları tanımlamam gerekiyor mu?

http://www.google.com/design/spec/components/buttons.html#buttons-usage

Varsayılan düğme stillerini bulamadım.

Misal:

 <Button style="@style/PrimaryButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Calculate"
    android:id="@+id/button3"
    android:layout_below="@+id/editText5"
    android:layout_alignEnd="@+id/editText5"
    android:enabled="true" />

Ekleyerek düğmenin arka plan rengini değiştirmeye çalışırsam

    android:background="@color/primary"

dokunmatik animasyon, gölge, yuvarlak köşe vb.Gibi tüm stiller kaybolur.


Ben bu wii en özelleştirilmiş düğme angrytools.com/android/button yardımcı olabilir
Kharak

Yanıtlar:


750

Sağladığım diğer cevaplardan hiçbirini kullanmadığım için cevabımı ekleyeceğim.

Destek Kitaplığı v7 ile tüm stiller zaten tanımlanmış ve kullanıma hazırdır, standart düğmeler için bu stillerin tümü kullanılabilir:

style="@style/Widget.AppCompat.Button"
style="@style/Widget.AppCompat.Button.Colored"
style="@style/Widget.AppCompat.Button.Borderless"
style="@style/Widget.AppCompat.Button.Borderless.Colored"

Widget.AppCompat.Button: resim açıklamasını buraya girin

Widget.AppCompat.Button.Colored: resim açıklamasını buraya girin

Widget.AppCompat.Button.Borderless resim açıklamasını buraya girin

Widget.AppCompat.Button.Borderless.Colored: resim açıklamasını buraya girin


Soruyu cevaplamak için kullanılacak stil bu nedenle

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

Renk nasıl değiştirilir

Tüm uygulama için:

Tüm kullanıcı arayüzü denetimlerinin rengi (yalnızca düğmeler değil, aynı zamanda kayan eylem düğmeleri, onay kutuları vb.) BuradacolorAccent açıklandığı gibi özellik tarafından yönetilir . Bu stili değiştirebilir ve tema tanımınıza kendi renginizi uygulayabilirsiniz:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    ...
    <item name="colorAccent">@color/Orange</item>
</style>

Belirli bir düğme için:

Belirli bir düğmenin stilini değiştirmeniz gerekirse, yukarıda açıklanan üst stillerden birini devralan yeni bir stil tanımlayabilirsiniz. Aşağıdaki örnekte arka plan ve yazı tipi renklerini yeni değiştirdim:

<style name="AppTheme.Button" parent="Widget.AppCompat.Button.Colored">
    <item name="colorButtonNormal">@color/Red</item>
    <item name="android:textColor">@color/White</item>
</style>

O zaman bu yeni stili butona uygulamanız yeterlidir:

android:theme="@style/AppTheme.Button"

Bir mizanpajda varsayılan düğme tasarımı ayarlamak için, bu satırı styles.xml temasına ekleyin:

<item name="buttonStyle">@style/btn</item>

@style/btndüğme temanız nerede . Bu, belirli bir temaya sahip bir mizanpajdaki tüm düğmeler için düğme stilini ayarlar


6
Bence bu şu andan itibaren bunu yapmanın en iyi yolu.
xsorifc28

5
Kitkat cihazında test ettiniz mi?
maohieng

14
colorButtonNormalAndroid 4.1.2'de attr benim için çalışmıyor. Hiç düğme rengini ayarlayamaz (düğmenin android:backgroundmalzeme stilini kırır).
Konstantin Konopko

2
@YoannHercouet bu görüntüleri hangi Android sürümünde yaptınız? Benim Andro 4.1.2 ve 4.4.2 stil = ".. AppCompat.Button" düğmeleriyle yükseltilmez.
Grzegorz Dev

5
@konopko Eğer benim gibiysen , ikincisine geçmek style=""yerine bunu benim için çözdünAndroid:theme=""
John Snow

84

En Basit Çözüm


1. Adım: En son destek kitaplığını kullanın

compile 'com.android.support:appcompat-v7:25.2.0'

2. Adım: Üst Aktivite sınıfınız olarak AppCompatActivity'yi kullanın

public class MainActivity extends AppCompatActivity

3. Adım: Düzen XML dosyanızda uygulama ad alanını kullanın

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

Adım 4: Düğme yerine AppCompatButton kullanın

<android.support.v7.widget.AppCompatButton
    android:id="@+id/buttonAwesome"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Awesome Button"
    android:textColor="@color/whatever_text_color_you_want"
    app:backgroundTint="@color/whatever_background_color_you_want"/>

resim açıklamasını buraya girin


7
Belirtmeniz gerekmez, android.support.v7.widget.AppCompatButtonçünkü oluşturma aracı , belirttiğinizde bunu otomatik olarak kullanırButton
Mark

2
otomatik olarak etkinleştirilecek / devre dışı bırakılacak mı? ya da bunun için stilleri tekrar belirtmemiz gerekiyor mu?
Sundeep1501

Bu benim için lolipop öncesi durum listesini kaldırır, herhangi bir tıklama efekti olmadan bir düğme ile sonuçlanır
Florian Walther

Devre dışı bırakılan durum textColoriçin metin rengini geçersiz kılması dışında, Android P'de çalışıyor gibi görünüyor .
l33t

@ Sundeep1501 Widget.MaterialComponents.Button.OutlinedButtonEn azından için griye dönmedi .
Dr.jacky

66

Seni doğru anlıyorsam, böyle bir şey yapmak istiyorsun:
resim açıklamasını buraya girin

Bu durumda, sadece kullanmak yeterli olmalıdır:

<item name="android:colorButtonNormal">#2196f3</item>

Veya 21'den az API için:

<item name="colorButtonNormal">#2196f3</item>

Materyal Tema Eğitimi Kullanma ek olarak .

Animasyonlu varyant burada .


1
@androiddeveloper örneği GitHub'a aktardı, temel şey burada - github.com/AlexKorovyansky/BlueRaisedButton/blob/master/app/src/… ,
AlexKorovyansky

Eski sürümler için uyumlu kitaplık kullanmanız gerektiğini düşünüyorum.
AlexKorovyansky

2
Değil, ancak API 21 ve üstü olması durumunda ayarlayabilirsiniz. Bir yol buldum, ama bunu yapmanın en iyi yolunun ne olduğunu bilmiyorum.
android geliştirici

4
bu yaklaşımla birden fazla renge sahip olabilir miyim? her seferinde sadece bir tanesine izin veriyor gibi görünüyor.
gerfmarquez

2
@gerfmarquez U gerek tk farklı düğmeler için farklı stilleri var
KISHORE_ZE

39

İşte istediğimi böyle elde ettim.

İlk olarak, bir düğme (in styles.xml) yaptı:

<style name="Button">
    <item name="android:textColor">@color/white</item>
    <item name="android:padding">0dp</item>
    <item name="android:minWidth">88dp</item>
    <item name="android:minHeight">36dp</item>
    <item name="android:layout_margin">3dp</item>
    <item name="android:elevation">1dp</item>
    <item name="android:translationZ">1dp</item>
    <item name="android:background">@drawable/primary_round</item>
</style>

Düğmenin dalgalanma ve arka planı, çekilebilir olarak primary_round.xml:

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/primary_600">
  <item>
    <shape xmlns:android="http://schemas.android.com/apk/res/android">
        <corners android:radius="1dp" />
        <solid android:color="@color/primary" />
    </shape>
  </item>
</ripple>

Bu aradığım dalgalanma etkisini ekledi.


3
Çerçeve varlıklarını eşleştirmek için köşe yarıçapı 2dp olmalıdır. Ayrıca, translationZ XML olarak ayarlanmamalıdır ve varsayılan yükselişi, minWidth, minHeight veya margin'i geçersiz kılmaya gerek yoktur.
alanv

Özel bir stil uygulandığında varsayılan kenar boşluğu 0 olur, bu nedenle özellikler devralınmaz.
xsorifc28

3
Ah, bir ebeveyn stili kaçırdığını fark etmedim. Parent = "Widget.Material.Button" eklemeniz veya tamamen özel bir stil oluşturmayı atlamanız ve düğmenin arka planını ayarlamanız yeterlidir.
alanv

Ah! Var olduğunu bilmiyordum, herhangi bir belgede rastlamadım. Onu deneyeceğim.
xsorifc28

Yine de, özel bir stil olmadan nasıl yapmam gerektiğinden emin değilim. Bana bir örnek gösterebilir misin?
xsorifc28

33

Nov 2018 yılında Android Malzeme Bileşenlerinin kararlı sürümü ile Google, ad alanından malzeme bileşenleri taşındı android.support.designiçin com.google.android.material.
Material Component kütüphanesi , Android'in Tasarım Destek Kütüphanesi'nin yerini almıştır.

Ekle bağımlılık adresinden Müşteri build.gradle:

dependencies { implementation com.google.android.material:material:1.0.0 }

Ardından MaterialButton, düzeninize ekleyin :

<com.google.android.material.button.MaterialButton
        style="@style/Widget.MaterialComponents.Button.OutlinedButton" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/app_name"
        app:strokeColor="@color/colorAccent"
        app:strokeWidth="6dp"
        app:layout_constraintStart_toStartOf="parent"
        app:shapeAppearance="@style/MyShapeAppearance"
   />

Belgelerin tamamını buradan ve API'yı buradan kontrol edebilirsiniz .

Arka plan rengini değiştirmek için 2 seçeneğiniz vardır.

  1. backgroundTintÖzniteliği kullanma .

Gibi bir şey:

<style name="MyButtonStyle"
 parent="Widget.MaterialComponents.Button">
    <item name="backgroundTint">@color/button_selector</item>
    //..
</style>
  1. Bence en iyi seçenek olacak. Bazı tema niteliklerini varsayılan bir stilde geçersiz kılmak istiyorsanız, yeni materialThemeOverlayözellik kullanabilirsiniz .

Gibi bir şey:

<style name="MyButtonStyle"
 parent="Widget.MaterialComponents.Button">
   <item name=“materialThemeOverlay”>@style/GreenButtonThemeOverlay</item>
</style>

<style name="GreenButtonThemeOverlay">
  <!-- For filled buttons, your theme's colorPrimary provides the default background color of the component --> 
  <item name="colorPrimary">@color/green</item>
</style>

# 2 seçeneği için 'com.google.android.material:material:1.1.0'.

resim açıklamasını buraya girinresim açıklamasını buraya girin

ESKİ Destek Kütüphanesi:

Yeni Destek Kitaplığı 28.0.0 ile Tasarım Kitaplığı artık MaterialButton.

Bu düğmeyi aşağıdakilerle düzen dosyamıza ekleyebilirsiniz:

<android.support.design.button.MaterialButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="YOUR TEXT"
    android:textSize="18sp"
    app:icon="@drawable/ic_android_white_24dp" />

Varsayılan olarak bu sınıf , düğmelerin metin rengi için beyazla birlikte arka plan rengiyle doldurulmuş düğmeler için temanızın vurgu rengini kullanır .

Düğmeyi şu özelliklerle özelleştirebilirsiniz:

  • app:rippleColor: Düğme dalgalanma efekti için kullanılacak renk
  • app:backgroundTint: Düğmenin arka planına renk tonu uygulamak için kullanılır. Düğmenin arka plan rengini değiştirmek istiyorsanız, arka plan yerine bu özelliği kullanın.

  • app:strokeColor: Düğme konturu için kullanılacak renk

  • app:strokeWidth: Düğme konturu için kullanılacak genişlik
  • app:cornerRadius: Düğmenin köşeleri için kullanılan yarıçapı tanımlamak için kullanılır

android.support.design.button.MaterialButton
derlenmiyor

3
@IgorGanapolsky Haklısın. Cevabı kararlı sürümle güncelledik.
Gabriele Mariotti

20

İşte uygulamanızda düğme stilini tutarlı bir şekilde uygulamanıza yardımcı olacak bir örnek.

İşte belirli stillerle kullandığım örnek bir Tema ..

<style name="MyTheme" parent="@style/Theme.AppCompat.Light">
   <item name="colorPrimary">@color/primary</item>
    <item name="colorPrimaryDark">@color/primary_dark</item>
    <item name="colorAccent">@color/accent</item>
    <item name="android:buttonStyle">@style/ButtonAppTheme</item>
</style>
<style name="ButtonAppTheme" parent="android:Widget.Material.Button">
<item name="android:background">@drawable/material_button</item>
</style>

Res / drawable-v21 klasöründeki düğme şeklini ve efektlerini bu şekilde tanımladım ...

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?attr/colorControlHighlight">
  <item>
    <shape xmlns:android="http://schemas.android.com/apk/res/android">
      <corners android:radius="2dp" /> 
      <solid android:color="@color/primary" />
    </shape>
  </item>
</ripple>

2dp köşeleri onu Malzeme temasıyla tutarlı tutmak içindir.


6
Geriye dönük uyumlu mu?
Skynet

Maalesef cevap vermede geç kaldım, temalar oldukça geç tanıtıldığı için geriye dönük olarak uyumlu değil.
samkya

18

Yanında android.support.design.button.MaterialButton( Gabriele Mariotti tarafından bahsedilen ),

Farklı stilleri olan ve aşağıdakilerden uzanan başka bir Buttonwidget com.google.android.material.button.MaterialButtonda var AppCompatButton:

style="@style/Widget.MaterialComponents.Button"
style="@style/Widget.MaterialComponents.Button.UnelevatedButton"
style="@style/Widget.MaterialComponents.Button.TextButton"
style="@style/Widget.MaterialComponents.Button.Icon"
style="@style/Widget.MaterialComponents.Button.TextButton.Icon"

Dolgulu, yüksek Button(varsayılan) :resim açıklamasını buraya girin

style="@style/Widget.MaterialComponents.Button"

Dolgulu, kaldırılmamışButton :resim açıklamasını buraya girin

style="@style/Widget.MaterialComponents.Button.UnelevatedButton"

MetinButton : resim açıklamasını buraya girin

style="@style/Widget.MaterialComponents.Button.TextButton"

SimgeButton : resim açıklamasını buraya girin

style="@style/Widget.MaterialComponents.Button.Icon"
app:icon="@drawable/icon_24px" // Icons can be added from this

Bir metin Buttonbir simgeyle: :resim açıklamasını buraya girin


Okuyun: https://material.io/develop/android/components/material-button/

Yeni bir Malzeme düğmesi oluşturmak için bir kolaylık sınıfı.

Bu sınıf, yapıcıdaki düğme için güncellenmiş Malzeme stilleri sağlar. Widget, stil bayrağını kullanmadan doğru varsayılan Malzeme stillerini görüntüler.


1
Onun rengini nasıl değiştirebileceğini biliyor musun?
Daniel Gomez Rico

1
app:backgroundTint: & app:backgroundTintModeDan belgeleri .
ท ઽ ૯ ท

nasıl devre dışı bırakılmış devlet renk atamak
Zaid Mirza

6

Çok fazla cevap ve üçüncü parti libs denedim, ama hiçbiri dezavantaj olmadan lolipop üzerinde dalgalanma etkisi olurken sınır tutmak ve lolipop öncesi etkisi artırıyordu. İşte birkaç cevabı birleştiren son çözümüm (gri tonlamalı renk derinliği nedeniyle gifler üzerinde kenarlık / yükseltmeler iyi işlenmiyor):

Lolipop

resim açıklamasını buraya girin

Ön lolipop

resim açıklamasını buraya girin

build.gradle

compile 'com.android.support:cardview-v7:23.1.1'

Layout.xml

<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"
    card_view:cardElevation="2dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    card_view:cardMaxElevation="8dp"
    android:layout_margin="6dp"
    >
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="0dp"
        android:background="@drawable/btn_bg"
        android:text="My button"/>
</android.support.v7.widget.CardView>

çekilebilir-V21 / btn_bg.xml

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

çekilebilir / btn_bg.xml

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

Aktivite onCreate

    final CardView cardView = (CardView) findViewById(R.id.card);
    final Button button = (Button) findViewById(R.id.button);
    button.setOnTouchListener(new View.OnTouchListener() {
        ObjectAnimator o1 = ObjectAnimator.ofFloat(cardView, "cardElevation", 2, 8)
                .setDuration
                        (80);
        ObjectAnimator o2 = ObjectAnimator.ofFloat(cardView, "cardElevation", 8, 2)
                .setDuration
                        (80);

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    o1.start();
                    break;
                case MotionEvent.ACTION_CANCEL:
                case MotionEvent.ACTION_UP:
                    o2.start();
                    break;
            }
            return false;
        }
    });

Tam bir örnek arıyordum, bu daha yüksek oy verilmedi şaşırttı - teşekkürler.
XMAN

4

1) xml çizilebilir tanımlayarak yuvarlak köşe düğmesi oluşturabilir ve düğme köşesinin yuvarlaklığını artırmak veya azaltmak için yarıçapı artırabilir veya azaltabilirsiniz. Bu xml'yi çekilebilir düğmenin arka planı olarak ayarlayın.

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetLeft="4dp"
    android:insetTop="6dp"
    android:insetRight="4dp"
    android:insetBottom="6dp">
    <ripple android:color="?attr/colorControlHighlight">
        <item>
            <shape android:shape="rectangle"
                android:tint="#0091ea">
                <corners android:radius="10dp" />
                <solid android:color="#1a237e" />
                <padding android:bottom="6dp" />
            </shape>
        </item>
    </ripple>
</inset>

yuvarlak köşe düğmesi

2) Düğme durumları arasında varsayılan gölge ve gölge geçiş animasyonunu değiştirmek için seçiciyi tanımlamanız ve android: stateListAnimator özelliğini kullanarak düğmeye uygulamanız gerekir. Tam düğme özelleştirme referansı için: http://www.zoftino.com/android-button


1

Düğme rengini ve dalgalanma rengini kolayca değiştirmenize izin veren bir android kütüphanesi oluşturdum

https://github.com/xgc1986/RippleButton

<com.xgc1986.ripplebutton.widget.RippleButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/btn"
    android:text="Android button modified in layout"
    android:textColor="@android:color/white"
    app:buttonColor="@android:color/black"
    app:rippleColor="@android:color/white"/>

Farklı bir renge sahip olmak istediğiniz her düğme için bir stil oluşturmanız gerekmez, böylece renkleri rastgele özelleştirebilirsiniz


1
Kütüphane hata rippleColor has already been definedveriyor : bazı kullanıcılar 'sorunlar'da zaten bahsetti
SagiLow

0

görünüme z ekseni ekleyerek havacılık yapabilir ve varsayılan gölgesi olabilir. bu özellik L önizlemesinde sağlanmıştır ve yayınlandıktan sonra kullanıma sunulacaktır. Şimdilik düğme görünümü için bu görünümü veren bir resim ekleyebilirsiniz.


Anlıyorum. Bunu manuel olarak yapmam gerekiyor. Radyal dokunma efektini eklemeye nasıl başlayabilirim? Sadece düğme için bir geçiş efekti mi?
xsorifc28

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.