Android में बटन क्लिक प्रभाव कैसे सेट करें?


105

एंड्रॉइड में, जब मैं पृष्ठभूमि छवि को बटन पर सेट करता हूं, तो मैं बटन पर कोई प्रभाव नहीं देख सकता हूं।

मुझे बटन पर कुछ प्रभाव की आवश्यकता है ताकि उपयोगकर्ता यह पहचान सके कि बटन क्लिक किया गया है।

बटन पर क्लिक करते समय कुछ सेकंड के लिए अंधेरा होना चाहिए, इसलिए मुझे इसके लिए क्या करना चाहिए?

धन्यवाद।



निम्न विधि आपको अपने सभी बटनों को उनके पाठ की परवाह किए बिना त्वचा को एक सिंगल स्टाइलक्लास का उपयोग करने की अनुमति देती है: stackoverflow.com/questions/5327553/…
ज़ैक मैरपेज़

नहीं, मैं इमेज बटन का उपयोग नहीं कर रहा हूं, मैं इसके लिए किसी भी आसान तरीके से नॉर्मल बटन का उपयोग कर रहा हूं?
जिग्नेश अंसोदरीया

3
इसका बहुत अच्छा ट्यूटोरियल: dibbus.com/2011/02/gradient-buttons-for-android
प्रतीक बुटानी

जवाबों:


154

यह बटन के लिए राज्यों की सूची युक्त एक ड्रॉबल xml फ़ाइल बनाकर प्राप्त किया जा सकता है। उदाहरण के लिए यदि आप एक नया xml फ़ाइल बनाते हैं जिसे "button.xml" कहा जाता है, तो निम्न कोड के साथ:

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

प्रेस पर एक काले रंग की उपस्थिति के साथ पृष्ठभूमि की छवि रखने के लिए, दूसरी xml फ़ाइल बनाएं और इसे निम्न कोड के साथ gradient.xml कॉल करें:

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

अपने बटन के xml में पृष्ठभूमि को बटन xml उदाहरण के लिए सेट करें

android:background="@drawable/button"

उम्मीद है की यह मदद करेगा!

संपादित करें: बटन में एक छवि (तुम्हारा) दिखाने के लिए उपरोक्त कोड को बदल दिया गया, क्योंकि यह एक ब्लॉक रंग के विपरीत है।


फिर मैं बटन बैकग्राउंड के लिए इमेज को कहाँ सेट कर सकता हूँ, सेट करने के लिए इमेज है
जिग्नेश अंसोदरीया

1
यह दिखाने के लिए कि राज्य XML के साथ पृष्ठभूमि छवि का उपयोग कैसे करें। अपनी ड्रॉएबल डायरेक्टरी में इमेज रिसोर्स से अपने को बदलें।
लेजडसन

यह केवल तभी काम करता है जब बटन का src आयताकार हो। अगर src drawable का कोई आकार अलग है, तो ग्रेडिएंट बैकग्राउंड पर भी लागू होगा, और यह दुखद है।
रेनाटो लोकेती

वास्तव में नहीं, हमेशा परत सूची में एक अलग आकार का उपयोग कर सकता है
Ljdawson

2
जब मैं एक छवि का उपयोग कर रहा हूँ यह मेरे लिए काम करता है .. लेकिन जब मैं एक Xml पृष्ठभूमि का उपयोग कर रहा हूँ। यह काम नहीं कर रहा है ...
DKV

88

यह बहुत आसान है जब आपके पास बहुत सारे छवि बटन हैं, और आप हर बटन के लिए xml-s लिखना नहीं चाहते हैं।

कोटलिन संस्करण:

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

जावा संस्करण:

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
मैं अपने कोड में इसका उपयोग करता हूं और एकमात्र समस्या जो मैंने अब तक देखी है वह यह है कि स्क्रॉल स्क्रॉल में रखे जाने पर बटन अजीब तरह से व्यवहार करता है।
Finnboy11

यह वास्तव में शानदार समाधान है और इसका सही उत्तर होना चाहिए
बिराज झालवाड़िया

यह कैसे बेहतर है? डिजाइनिंग को कोड के बाहर रखा जाना चाहिए, क्या यह नहीं होना चाहिए?
बग्स हैपन

इस समस्या का सिर्फ एक सरल समाधान है। जब आपके पास बहुत सारे बटन होते हैं और आप हर एक के लिए xml बनाना नहीं चाहते हैं तो यह मददगार हो सकता है।
अंद्रस

हे भगवान! एक टुकड़े में 5 बटन होने की कल्पना करें ... आपके पास इस बॉयलरप्लेट कोड का पूरा गुच्छा होगा ... फिर इसे कैसे रिफैक्ट किया जाए? सभी गतिविधियों में सभी बटन के लिए रंग फिल्टर बदलें? इम्हो यह आपका अगला डेवलपर इतना खुश नहीं होगा ..
लियो डायरोडोडर

84

अपना AlphaAnimationऑब्जेक्ट बनाएं जो यह तय करता है कि बटन का लुप्तप्राय प्रभाव कितना होगा, फिर इसे onClickListenerअपने बटनों में शुरू करें

उदाहरण के लिए :

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

// some code

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

बेशक यह सिर्फ एक तरीका है, सबसे पसंदीदा नहीं है, यह सिर्फ आसान है


5
मुझे इस समाधान के बारे में क्या पसंद है, यह है कि इसके लिए बहुत सारे चयनकर्ताओं की आवश्यकता नहीं है, जब आपके पास अपने स्वयं के कस्टम चित्रों के साथ कई बटन होते हैं।
पीट

2
यह एक टच डाउन पर बटन को फीका नहीं करता है, यह केवल क्लिक का पता लगने के बाद विभाजन के लिए इसे फीका कर देता है और उपयोगकर्ता की उंगली पहले ही हटा दी गई है।
डग वॉस

1
नाइस एंड सिंपल

@ डग वॉस, आप एनीमेशन की अवधि को अधिक लंबा करने के लिए सेट कर सकते हैं
अहमद एडेल इस्माइल

onLongClick और 'परिपत्र' के बारे में क्या?
एकौआ पित्त

44

आप बस क्लिक करने योग्य प्रभाव को प्राप्त करने के लिए अग्रभूमि का उपयोग कर सकते हैं View:

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


डार्क थीम के साथ उपयोग के लिए अपने विषय को भी जोड़ें layout(क्लिक करने योग्य प्रभाव स्पष्ट होने के लिए):

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

5
लागू करने का सबसे आसान तरीका। FYI करें, विशेषता Android: अग्रभूमि का एपीआई स्तर पर 23 से कम कोई प्रभाव नहीं है।
dolgom

1
सबसे सरल उपाय।
जेरी चोंग

2
यह स्वीकृत उत्तर होना चाहिए, बहुत सरल और यह अच्छा तरंग एनीमेशन प्रभाव जोड़ता है।
टायलर

1
@dolgom API स्तर के लिए <23 "पृष्ठभूमि" विशेषता पर इसका उपयोग करें। विशेषता: android: background = "? android: attr / selectableItemBackground"
Z3R0

24

अपने आइटम को सिस्टम लुक के अनुरूप बनाने और महसूस करने के लिए android:attr/selectableItemBackgroundअपने वांछित दृश्य की पृष्ठभूमि या अग्रभूमि टैग में सिस्टम विशेषता को संदर्भित करने का प्रयास करें:

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

एपीआई स्तर 23 के पहले / बाद में वांछित प्रभाव प्राप्त करने के लिए दोनों विशेषताओं का उपयोग करें।

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


2
अब तक का सबसे सरल उपाय। धन्यवाद!
टाइकोम

9

या केवल एक पृष्ठभूमि छवि का उपयोग करके आप क्लिक प्रभाव को प्राप्त कर सकते हैं setOnTouchListener

दो तरीके

((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;
        }
});

यहां छवि विवरण दर्ज करें

और यदि आप उपयोग नहीं करना चाहते हैं setOnTouchLister, तो इसे प्राप्त करने का दूसरा तरीका है

    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);

दूसरे तरीके से कोड में त्रुटियां हैं। GetCurrent () फ़ंक्शन क्या है? इसके अलावा myButton एक Drawable नहीं है, इसलिए इसे राज्य के रूप में नहीं जोड़ा जा सकता है।
एहतेशाम हसन

त्रुटि को इंगित करने के लिए धन्यवाद। मैंने इसे ठीक कर दिया है, और myButton बटन वर्ग का एक उदाहरण है जो विधि सेटबैकग्रैड्रैबल की आपूर्ति करता है और यह ड्रॉएबल इंस्टेंस लेता है, इसलिए यह काम करेगा।
विनायक बेविनकत्ती

मेरे उत्तर की जाँच करें जो आपके 2 के दृष्टिकोण पर आधारित है। stackoverflow.com/a/39430738/5229515
एहतेशाम हसन

यह अंत में "वापस झूठे" होना चाहिए ताकि यह घटना का उपभोग न करे और किसी भी अतिरिक्त onClickListeners को बुलाया जा सके।
डग वॉस

3

ऐसा करने के लिए बस एक और आसान तरीका जोड़ना चाहते हैं: यदि आपकी इमेजबटन इसकी पृष्ठभूमि बनी हुई है और आप इसे शून्य करने के लिए सेट नहीं करते हैं, तो यह एक सामान्य बटन की तरह काम करेगा और अन्य बटन की तरह क्लिक करते समय क्लिक एनीमेशन दिखाएगा। छिपाने का तरीका जबकि यह अभी भी है पृष्ठभूमि:

<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" />

पैडिंग पृष्ठभूमि को दृश्यमान नहीं होने देगा और बटन को अन्य बटन की तरह कार्य करेगा।


1
यदि यह गोलाकार है, तो यह स्क्वेर्ड बटन बॉर्डर को इमेज के चारों ओर
रखेगा

3

यह सबसे अच्छा समाधान है जो मैं @ विनायक के उत्तर से संकेत लेने के लिए आया हूं। अन्य सभी समाधानों में अलग-अलग कमियां हैं।

सबसे पहले इस तरह से एक फंक्शन बनाएं।

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);
}

स्पष्टीकरण:

getConstantState ()। newDrawable () का उपयोग मौजूदा ड्रिबल को क्लोन करने के लिए किया जाता है अन्यथा उसी ड्रॉबल का उपयोग किया जाएगा। यहाँ से और पढ़ें: Android: फ़िल्टर के साथ StateListDrawable बनाने के लिए एक ड्रॉबल क्लोनिंग

म्यूटेट () का उपयोग ड्रॉएबल क्लोन बनाने के लिए किया जाता है जो ड्रॉएबल के अन्य उदाहरणों के साथ अपने राज्य को साझा नहीं करता है। इसके बारे में यहाँ और पढ़ें: https://developer.android.com/reference/android/graphics/drawable/Drawable.html#mutate ()

उपयोग:

आप फ़ंक्शन के पैरामीटर के रूप में किसी भी प्रकार के व्यू (बटन, इमेजबटन, व्यू आदि) को पारित कर सकते हैं और उन्हें उनके लिए लागू प्रभाव मिलेगा।

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

सामग्री डिज़ाइन की गई स्थिति / क्लिक किए गए प्रभाव के लिए RippleDrawable का उपयोग करें।

इसे प्राप्त करने के लिए, .xml अंडर / ड्रा करने योग्य फ़ोल्डर के रूप में रिपल आइटम बनाएं और इसे एंड्रॉइड में उपयोग करें: किसी भी दृश्य के लिए पृष्ठभूमि।

  • उदाहरण के लिए दबाए गए / क्लिक किए गए आइकन का प्रभाव, उदाहरण के लिए, परिपत्र लहर प्रभाव का उपयोग करें:

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

  • आयत सीमा के साथ क्लिक किए गए दृश्य के लिए प्रभाव, हम मौजूदा ड्रॉबल की तरह रिपल जोड़ सकते हैं:

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

सभी विचारों के लिए

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

लेकिन कार्डव्यू के लिए जिसका उपयोग बढ़ा है

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

टूलबार के रूप में परिपत्र क्लिक प्रभाव के लिए

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

इसके अलावा आपको सेट करने की आवश्यकता है

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

0

Andràs जवाब के लिए एक मामूली जोड़ बनाना:

आप postDelayedरंग फिल्टर को अधिक ध्यान देने योग्य बनाने के लिए छोटी अवधि के लिए अंतिम समय तक उपयोग कर सकते हैं :

        @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 के मूल्य को बदल सकते हैं।


0

यदि आप IMG के बजाय xml पृष्ठभूमि का उपयोग कर रहे हैं, तो इसे हटा दें:

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

1 उत्तर से जो @Ljdawson ने हमें दिया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.