Android'de düğme tıklama efekti nasıl ayarlanır?


105

Android'de arka plan resmini Button olarak ayarladığımda buton üzerinde herhangi bir etki göremiyorum.

Kullanıcı bu düğmenin tıklandığını anlayabilmesi için düğme üzerinde biraz etkiye ihtiyacım var.

Düğme tıklandığında birkaç saniye koyu renkte olmalıdır, peki bunun için ne yapmalıyım?

Teşekkürler.



Aşağıdaki yöntem, metinleri ne olursa olsun tüm düğmelerinizin kaplamasını yapmak için tek bir stil sınıfı kullanmanıza olanak tanır: stackoverflow.com/questions/5327553/…
Zack Marrapese

hayır Resim Düğmesini kullanmıyorum, bunun için Normal Düğme kullanıyorum?
Jignesh Ansodariya

Yanıtlar:


155

Bu, düğme için bir durum listesi içeren çekilebilir bir xml dosyası oluşturarak gerçekleştirilebilir. Örneğin, aşağıdaki kodla "button.xml" adlı yeni bir xml dosyası oluşturursanız:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:state_pressed="false" android:drawable="@drawable/YOURIMAGE" />
    <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/gradient" />
    <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/gradient" />
    <item android:drawable="@drawable/YOURIMAGE" />
</selector>

Arka plan resmini baskıda koyulaştırılmış bir görünüme sahip tutmak için, ikinci bir xml dosyası oluşturun ve aşağıdaki kodla gradient.xml olarak adlandırın:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <bitmap android:src="@drawable/YOURIMAGE"/>
    </item>
    <item>
        <shape xmlns:android="http://schemas.android.com/apk/res/android">
            <gradient android:angle="90" android:startColor="#880f0f10" android:centerColor="#880d0d0f" android:endColor="#885d5d5e"/>
        </shape>
    </item>
</layer-list>

Düğmenizin xml'sinde arka planı düğme xml olacak şekilde ayarlayın örn.

android:background="@drawable/button"

Bu yardımcı olur umarım!

Düzenleme: Yukarıdaki kodu, blok renginin aksine düğmede bir görüntü (YOURIMAGE) gösterecek şekilde değiştirdi.


Öyleyse Görüntüyü ayarlamak için Düğme Arka Planı için Görüntüyü nereye ayarlayabilirim
Jignesh Ansodariya

1
Durum XML'si ile bir arka plan resminin nasıl kullanılacağını göstermek için düzenlendi. YOURIMAGE'ı çekilebilir dizininizdeki görüntü kaynağı ile değiştirin.
Ljdawson

Bu yalnızca düğmenin src'si dikdörtgense çalışır. Src çekilebilirinin bundan farklı bir şekli varsa, gradyan arka plana da uygulanacaktır ve bu üzücüdür.
Renato Lochetti

Pek değil, katman listesinde her zaman farklı bir şekil kullanabilir
Ljdawson

2
bir görüntü kullanırken benim için çalışıyor .. ama bir Xml arka plan kullandığımda. çalışmıyor ...
DKV

88

Çok sayıda resim düğmeniz olduğunda ve her düğme için xml-ler yazmak istemediğinizde daha basittir.

Kotlin Sürümü:

fun buttonEffect(button: View) {
    button.setOnTouchListener { v, event ->
        when (event.action) {
            MotionEvent.ACTION_DOWN -> {
                v.background.setColorFilter(-0x1f0b8adf, PorterDuff.Mode.SRC_ATOP)
                v.invalidate()
            }
            MotionEvent.ACTION_UP -> {
                v.background.clearColorFilter()
                v.invalidate()
            }
        }
        false
    }
}

Java Sürümü:

public static void buttonEffect(View button){
    button.setOnTouchListener(new OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    v.getBackground().setColorFilter(0xe0f47521,PorterDuff.Mode.SRC_ATOP);
                    v.invalidate();
                    break;
                }
                case MotionEvent.ACTION_UP: {
                    v.getBackground().clearColorFilter();
                    v.invalidate();
                    break;
                }
            }
            return false;
        }
    });
}

2
Bunu kodumda kullanıyorum ve şu ana kadar fark ettiğim tek sorun, düğmenin bir ScrollView'a yerleştirildiğinde garip davranması.
Finnboy11

Bu gerçekten mükemmel bir çözüm ve bu doğru cevap olmalı
Biraj Zalavadia 02

Bu nasıl daha iyi? Tasarım kodun dışında tutulmalı, değil mi?
Hatalar

Bu sorun için sadece basit bir çözüm. Çok sayıda düğmeniz olduğunda ve her biri için xml'ler oluşturmak istemiyorsanız, bu yardımcı olabilir.
András

Aman Tanrım! Bir parçada 5 düğme olduğunu hayal edin ... Bu standart kodun bir demetine sahip olacaksınız ... O halde nasıl yeniden düzenlenir? Tüm etkinliklerdeki tüm düğmelerin renk filtresi değiştirilsin mi? Imho, bir sonraki geliştiriciniz o kadar mutlu olmayacak ..
Leo Droidcoder

84

AlphaAnimationDüğmenin solma efektinin ne kadar olacağına karar veren Nesnenizi oluşturun , ardından onClickListenerdüğmelerinizden başlamasına izin verin

Örneğin :

private AlphaAnimation buttonClick = new AlphaAnimation(1F, 0.8F);

// some code

public void onClick(View v) {
    v.startAnimation(buttonClick);
}

Tabii ki bu sadece bir yol, en çok tercih edilen değil, sadece daha kolay


5
Bu çözümden hoşlandığım şey, her biri kendi özel görüntüsüne sahip çok sayıda düğmeniz olduğunda çok sayıda seçicinin oluşturulmasını gerektirmemesidir.
Pete

2
Bu, bir dokunuşta düğmeyi soldurmaz, yalnızca tıklama algılandıktan ve kullanıcının parmağı zaten kaldırıldıktan sonra bir saniye süreyle kaybolur.
Doug Voss

1
Güzel ve basit

@Doug Voss, daha uzun hale getirmek için animasyonun süresini ayarlayabilirsiniz
Ahmed Adel İsmail

onLongClick ve 'roundReveal' ne olacak?
Acauã Pitta

45

Basitçe yapabilirsin ön planı kullanmak sizin için Viewtıklanabilir etkiyi elde etmek için:

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


Koyu temayla kullanmak için ayrıca temanızı ekleyin .layout (tıklanabilir etkiyi netleştirin):

android:theme="@android:style/ThemeOverlay.Material.Dark"

5
Uygulamanın en kolay yolu. Bilginize, Attribute android: ön planın
23'ten

1
En basit çözüm.
Jerry Chong

2
Bu kabul edilen cevap olmalı, çok daha basit ve hoş dalgalanma animasyon efektini ekliyor.
Tyler

1
@dolgom API seviyesi <23 için "background" niteliğinde kullanın. Yani: android: background = "? android: attr / selectableItemBackground"
Z3R0

24

Öğenizin sistem görünümüyle tutarlı olmasını sağlamak için sistem özniteliğine başvurmayı deneyin android:attr/selectableItemBackground , istediğiniz görünümün arka planında veya ön plan etiketinde :

<ImageView
    ...
    android:background="?android:attr/selectableItemBackground"      
    android:foreground="?android:attr/selectableItemBackground"
    ...
/>

API seviyesi 23'ten önce / sonra istenen efekti elde etmek için her iki özelliği de kullanın.

https://stackoverflow.com/a/11513474/4683601


2
Açık ara en basit çözüm. Teşekkürler!
tykom

9

Veya yalnızca bir arka plan resmi kullanarak tıklama efektini elde edebilirsiniz. setOnTouchListener

İki yol

((Button)findViewById(R.id.testBth)).setOnTouchListener(new OnTouchListener() {

      @Override
        public boolean onTouch(View v, MotionEvent event) {
          switch (event.getAction()) {
              case MotionEvent.ACTION_DOWN: {
                  Button view = (Button) v;
                  view.getBackground().setColorFilter(0x77000000, PorterDuff.Mode.SRC_ATOP);
                  v.invalidate();
                  break;
              }
              case MotionEvent.ACTION_UP:
                  // Your action here on button click
              case MotionEvent.ACTION_CANCEL: {
                  Button view = (Button) v;
                  view.getBackground().clearColorFilter();
                  view.invalidate();
                  break;
              }
          }
          return true;
        }
});

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

Ve kullanmak istemiyorsanız, bunu setOnTouchListerbaşarmanın başka bir yolu da

    myButton.getBackground().setColorFilter(.setColorFilter(0xF00, Mode.MULTIPLY);

    StateListDrawable listDrawable = new StateListDrawable();
    listDrawable.addState(new int[] {android.R.attr.state_pressed}, drawablePressed);
    listDrawable.addState(new int[] {android.R.attr.defaultValue}, myButton);

    myButton.setBackgroundDrawable(listDrawable);

2. şekilde kodda hatalar var. GetCurrent () işlevi nedir? Ayrıca myButton bir Drawable değildir, bu yüzden state olarak eklenemez.
Ehtesham Hasan

Hatayı işaret ettiğiniz için teşekkürler. Bunu düzelttim ve myButton, setBackgroundDrawable yöntemini sağlayan Button sınıfının bir örneğidir ve Drawable örneklerini alır, dolayısıyla bu işe yarayacaktır.
Vinayak Bevinakatti

2. yaklaşımınıza dayanan cevabıma bakın. stackoverflow.com/a/39430738/5229515
Ehtesham Hasan

Bunun sonunda muhtemelen "yanlış döndürme" olmalıdır, böylece olayı tüketmez ve herhangi bir ek onClickListener çağrılabilir.
Doug Voss

3

Bunu yapmanın başka bir kolay yolunu eklemek istiyorum: ImageButton'ınız arka planında kalırsa ve siz onu boş olarak ayarlamazsanız, normal bir düğme gibi çalışacak ve diğer düğmeler gibi tıklarken tıklama animasyonunu gösterecektir. hala oradayken arka plan:

<ImageButton
    android:id="@+id/imageButton2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingBottom="1dp"
    android:paddingLeft="1dp"
    android:paddingRight="1dp"
    android:paddingTop="1dp"
    android:src="@drawable/squareicon" />

Dolgular, arka planın görünür olmasına izin vermez ve düğmenin diğer düğmeler gibi davranmasını sağlamaz.


1
bu, daire şeklindeyse resmin etrafındaki kare düğme kenarlığını koruyacaktır
MSaudi

3

@ Vinayak'ın cevabından ipuçları alarak bulduğum en iyi çözüm bu. Diğer tüm çözümlerin farklı dezavantajları vardır.

Öncelikle bunun gibi bir işlev oluşturun.

void addClickEffect(View view)
{
    Drawable drawableNormal = view.getBackground();

    Drawable drawablePressed = view.getBackground().getConstantState().newDrawable();
    drawablePressed.mutate();
    drawablePressed.setColorFilter(Color.argb(50, 0, 0, 0), PorterDuff.Mode.SRC_ATOP);

    StateListDrawable listDrawable = new StateListDrawable();
    listDrawable.addState(new int[] {android.R.attr.state_pressed}, drawablePressed);
    listDrawable.addState(new int[] {}, drawableNormal);
    view.setBackground(listDrawable);
}

Açıklama:

getConstantState (). newDrawable (), mevcut Drawable'ı klonlamak için kullanılır, aksi takdirde aynı drawable kullanılır. Buradan daha fazlasını okuyun: Android: Filtrelerle bir StateListDrawable yapmak için bir çekilebilirliği klonlama

mutate (), Drawable klonun durumunu diğer Drawable örnekleriyle paylaşmamasını sağlamak için kullanılır. Buradan daha fazla bilgi edinin: https://developer.android.com/reference/android/graphics/drawable/Drawable.html#mutate ()

Kullanım:

Fonksiyona parametre olarak her türlü View (Button, ImageButton, View vb.) İletebilirsiniz ve bunlara uygulanan tıklama efektini alırlar.

addClickEffect(myButton);
addClickEffect(myImageButton);

2
Step: set a button in XML with onClick Action:

 <Button
android:id="@+id/btnEditUserInfo"
style="?android:borderlessButtonStyle"
android:layout_width="wrap_content"
android:layout_height="@dimen/txt_height"
android:layout_gravity="center"
android:background="@drawable/round_btn"
android:contentDescription="@string/image_view"
android:onClick="edit_user_info"
android:text="Edit"
android:textColor="#000"
android:textSize="@dimen/login_textSize" />

Step: on button clicked show animation point
//pgrm mark ---- ---- ----- ---- ---- ----- ---- ---- -----  ---- ---- -----

    public void edit_user_info(View view) {

        // show click effect on button pressed
        final AlphaAnimation buttonClick = new AlphaAnimation(1F, 0.8F);
        view.startAnimation(buttonClick);

        Intent intent = new Intent(getApplicationContext(),  EditUserInfo.class);
        startActivity(intent);

    }// end edit_user_info

2

Materyal Tasarım durumu basılı / tıklanmış efekti için RippleDrawable'ı kullanın.

Bunu başarmak için / drawable klasörünün altında .xml olarak dalgalanma öğesi oluşturun ve bunu herhangi bir görünüm için android: arka planda kullanın.

  • Basılan / tıklanan simge için efekt, dairesel dalgalanma efekti kullanın, örneğin:

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

  • Dikdörtgen sınırla tıklanan görünümün etkisi, aşağıdaki gibi mevcut çekilebilir öğenin üzerine dalgalanma ekleyebiliriz:

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


2

Tüm görünümler için

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

Ancak yükseklik kullanımı olan kart görünümü için

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

Araç çubuğundaki gibi Dairesel tıklama efekti için

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

Ayrıca ayarlaman gerekiyor

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

0

Andràs yanıtına küçük bir ekleme yapmak:

Sen kullanabilirsiniz postDelayeddaha kolay fark edilebilir hale getirmek için zaman küçük bir süre için renk filtresi son yapmak:

        @Override
        public boolean onTouch(final View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    v.getBackground().setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
                    v.invalidate();
                    break;
                }
                case MotionEvent.ACTION_UP: {
                    v.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            v.getBackground().clearColorFilter();
                            v.invalidate();
                        }
                    }, 100L);
                    break;
                }
            }
            return false;
        }

100L gecikmenin değerini ihtiyaçlarınıza göre değiştirebilirsiniz.


0

IMG yerine xml arka planı kullanıyorsanız, şunu kaldırın:

<item>
    <bitmap android:src="@drawable/YOURIMAGE"/>
</item>

@Ljdawson'ın bize verdiği ilk cevaptan.


0

Animasyon için bounce.xml dosyası oluşturun

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

    <scale
        android:duration="100"
        android:fromXScale="0.9"
        android:fromYScale="0.9"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1.0"
        android:toYScale="1.0" />

</set>

Başlatmak için bu satırı onClick'e ekleyin

final Animation myAnim = AnimationUtils.loadAnimation (bu, R.anim.bounce); button.startAnimation (myAnim);

Bir düğme tıklamasında küçültme efekti elde edersiniz.

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.