मैं एंड्रॉइड पर एक बटन की तरह एक छवि क्लिक प्रभाव कैसे दे सकता हूं?


84

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

जवाबों:


53

आप क्लिक किए गए राज्यों / क्लिक नहीं किए गए राज्यों के लिए अलग-अलग चित्र डिज़ाइन कर सकते हैं और उन्हें निम्न प्रकार से सेट कर सकते हैं

final ImageView v = (ImageView) findViewById(R.id.button0);
        v.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View arg0, MotionEvent arg1) {
                switch (arg1.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    v.setImageBitmap(res.getDrawable(R.drawable.img_down));
                    break;
                }
                case MotionEvent.ACTION_CANCEL:{
                    v.setImageBitmap(res.getDrawable(R.drawable.img_up));
                    break;
                }
                }
                return true;
            }
        });

बेहतर विकल्प यह है कि आप एक चयनकर्ता को निम्नानुसार परिभाषित करते हैं

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true"   
        android:drawable="@drawable/img_down" />
    <item android:state_selected="false"   
        android:drawable="@drawable/img_up" />
</selector>

और घटना में छवि का चयन करें:

v.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View arg0, MotionEvent arg1) {
                v.setSelected(arg1.getAction()==MotionEvent.ACTION_DOWN);
                return true;
            }
        });

1
क्या आप बता सकते हैं कि res.getDrawable Res क्या करता है?
वेनुष्काट

v.setSelected केवल == सच एक बार होगा, तुरंत MotionEvent.ACTION_MOVE के कारण असत्य की ओर बढ़ेगा। एक बार जब उंगली जारी हो जाती है, तो MotionEvent.ACTION_UP होता है। यदि चयनकर्ता विधि का उपयोग करते हैं, तो अलग-अलग तर्क का उपयोग करके सेट करें या सेट करें। if (arg1.getAction () == MotionEvent.ACTION_DOWN) {v.setPressed (सत्य); } और अगर (arg1.getAction () == MotionEvent.ACTION_UP) {v.setPressed (झूठा); }
एडम डेनून

MotionEvent.ACTION_DOWN || MotionEvent.ACTION_MOVEजब तक हम दबा रहे हैं, तब तक छवि को दिखाने के लिए बेहतर होगा ।
आल्हा एम।

आप की जरूरत नहीं है setOnTouchListener(...। आप बस <selector ...>XML बना सकते हैं और फिर ImageView क्लिक करने योग्य को XML में सेट कर सकते हैं जैसे<ImageView ... android:clickable="true" android:focusable="true" android:src="@drawable/my_selector" />
पियरे

76

आप कुछ इस तरह का उपयोग करके एक ही छवि के साथ कर सकते हैं:

     //get the image view
    ImageView imageView = (ImageView)findViewById(R.id.ImageView);

    //set the ontouch listener
    imageView.setOnTouchListener(new OnTouchListener() {

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

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    ImageView view = (ImageView) v;
                    //overlay is black with transparency of 0x77 (119)
                    view.getDrawable().setColorFilter(0x77000000,PorterDuff.Mode.SRC_ATOP);
                    view.invalidate();
                    break;
                }
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_CANCEL: {
                    ImageView view = (ImageView) v;
                    //clear the overlay
                    view.getDrawable().clearColorFilter();
                    view.invalidate();
                    break;
                }
            }

            return false;
        }
    });

मैं इसे आसानी से ImageView (या ImageButton के उपवर्ग में बना रहा हूँ क्योंकि यह आसान पुन: प्रयोज्य के लिए ImageView का एक उपवर्ग भी है), लेकिन इससे आपको एक छवि के लिए "चयनित" लुक लागू करने की अनुमति मिल सकती है।


2
मैंने ACTION_CANCEL के लिए एक मामला भी जोड़ा, यह बहुत अच्छा काम करता है, धन्यवाद!
एलन

अच्छी कॉल - मैंने खुद को अपने कोड में जोड़ा था लेकिन इसे यहां भी अपडेट करूंगा।
श्री ज़ोर्न

1
यह एक और सवाल हो सकता है, लेकिन मैं ACTION_UP के बाद कैसे रद्द करूंगा? विशेष रूप से ... उपयोगकर्ता हिट छवि। उपयोगकर्ता को रद्द करने के लिए छवि से उंगली छीनी जाती है। लेकिन इस कोड के साथ कार्रवाई रद्द नहीं की जाती है
सुडोकू

मैं MotionEvent.ACTION_OUTSIDE;) को भी जोड़
दूंगा

3
आप वापस लौटना चाहते हैं false, अन्यथा दृश्य की वास्तविक onClick()घटना को निकाल नहीं दिया जाएगा
निमरोड दयान

45

ColorFilter विधि का उपयोग करके केवल एक छवि फ़ाइल के साथ करना संभव है । हालाँकि, ColorFilter ImageViews के साथ काम करने की उम्मीद करता है न कि बटन के साथ, इसलिए आपको अपने बटन को ImageViews में बदलना होगा। यह एक समस्या नहीं है यदि आप वैसे भी अपने बटनों के रूप में छवियों का उपयोग कर रहे हैं, लेकिन यह अधिक कष्टप्रद है यदि आपके पास पाठ था ... वैसे भी, आपको लगता है कि पाठ के साथ समस्या का एक रास्ता मिल गया है, यहां उपयोग करने के लिए कोड है:

ImageView button = (ImageView) findViewById(R.id.button);
button.setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);

यह बटन पर एक लाल ओवरले लागू करता है (रंग कोड पूरी तरह से अपारदर्शी लाल के लिए हेक्स कोड है - पहले दो अंक पारदर्शिता हैं, फिर यह आरआर जीजी बीबी है।)।


3
क्या आप बता सकते हैं कि उस कोड के चलने के बाद क्या होने वाला है, और इसे कहां बुलाया जाना है? मैंने ImageView आरंभीकरण पर इन 2 पंक्तियों को कॉल करने की कोशिश की है - यह मेरी छवि को लाल रंग में पेंट करता है और तब कुछ भी नहीं होता है, न तो क्लिक पर, न ही स्पर्श पर। टच करने पर कॉल करना।
एस्टेव्ही

45

EDIT : यद्यपि नीचे दिया गया मूल उत्तर काम करता है और स्थापित करना आसान है, इस पोस्ट को Google पर एक एंड्रॉइड डेवलपर एडवोकेट द्वारा संदर्भित करें यदि आप चाहते हैं / अधिक कुशल कार्यान्वयन की आवश्यकता है। यह भी ध्यान दें कि यह android:foregroundविशेषता Android M में डिफ़ॉल्ट रूप से ImageView सहित सभी दृश्यों पर आ रही है।


एक ImageView के लिए चयनकर्ता का उपयोग करने में समस्या यह है कि आप इसे केवल दृश्य की पृष्ठभूमि के रूप में सेट कर सकते हैं - जब तक आपकी छवि अपारदर्शी है, तब तक आपको इसके पीछे चयनकर्ता का प्रभाव नहीं दिखाई देगा।

ट्रिक फ्रेमवर्क में अपने ImageView को उस विशेषता के साथ लपेटने के लिए है android:foregroundजो हमें इसकी सामग्री के लिए एक ओवरले को परिभाषित करने की अनुमति देता है। यदि हम android:foregroundएक चयनकर्ता (उदाहरण के ?android:attr/selectableItemBackgroundलिए एपीआई स्तर 11+ के लिए) पर सेट होते हैं और OnClickListenerImageView के बजाय फ़्रेमलैटआउट के साथ संलग्न करते हैं , तो छवि हमारे चयनकर्ता के ड्रॉबल के साथ ओवरलेड हो जाएगी - क्लिक प्रभाव हम चाहते हैं!

देखो:

<FrameLayout
    android:id="@+id/imageButton"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:foreground="?android:attr/selectableItemBackground" >

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/yourImageFile" />

</FrameLayout>

(ध्यान दें कि यह आपके मूल लेआउट के भीतर रखा जाना चाहिए।)

final View imageButton = findViewById(R.id.imageButton);
imageButton.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View view) {
        // do whatever we wish!
    }
});

2
महान ! यह एक बहुत अच्छा उपाय है। एसएमएस या कॉल कार्यों के लिए संपर्क अनुप्रयोग में उपयोग किया गया एक ही समाधान।
जेरी

API <11. में काम नहीं करते? Android: attr / selectableItemBackground के लिए API स्तर 11 (वर्तमान मिनट 8 है)
MSaudi

यह selectableItemBackgroundविशेषता केवल API स्तर 11 में जोड़ी गई थी, इसलिए यदि आप पुराने API स्तरों के लिए इस समाधान का उपयोग करना चाहते हैं, तो आपको किसी अन्य चयनकर्ता का उपयोग करना होगा। उदाहरण के लिए, मेरे एक एप्लिकेशन के लिए जो एपीआई स्तर 7 का समर्थन करता है, मैं एंड्रॉइड होलो कलर्स जेनरेटर टूल@drawable/list_selector_holo_light का उपयोग करके उत्पन्न संसाधन का उपयोग करता हूं ।
जस्टस्म

आप केवल 1 का <ImageButton>चयन करके एक ही व्यवहार प्राप्त कर सकते हैं ।
योहन दाहमणि

28

उपयोग शैली = "एंड्रॉयड: borderlessButtonStyle" एक्सएमएल फ़ाइल में। यह Android डिफ़ॉल्ट क्लिक प्रभाव दिखाएगा।

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_launcher" 
    style="?android:borderlessButtonStyle"
/>

1
यह वास्तव में सबसे अच्छा जवाब है, एक बहुत आसान
फ्रैंकमोंज़ा

1
यह पैडिंग सेट करता है, और यदि आप पैडिंग को 0 पर सेट करते हैं, तो यदि आप जो इमेज देते हैं, वह पूरी इमेज व्यू लेती है, तो आपको क्लिक करने का कोई प्रभाव नहीं दिखेगा।
एंड्रॉइड डेवलपर

2
@androiddeveloper का उपयोग android:adjustViewBounds="true"पैडिंग को अनसेट करना है।
हाफिज दिवांदरी

1
इसका उपयोग करने की अनुशंसा की जाती है style="?android:attr/borderlessButtonStyle": developer.android.com/guide/topics/ui/controls/…
Hafez Divandari

21

बस एक ImageButton का उपयोग करें ।


3
मैं व्यक्तिगत रूप से इसे ImageView की तरह नहीं बना सकता। कोई बॉर्डर नहीं, इमेज को इमेजबटन आदि के आकार तक फैलाएं। यदि आप इस बॉर्डर और स्ट्रेच इश्यू को दे सकते हैं, और अपनी पोस्ट को अपडेट कर सकते हैं। मेरा कुछ ख्याति आपको इनाम के रूप में जाता है =)
तारीख को

15

इसे हल करने का मेरा सरल तरीका यहां है:

ImageView iv = (ImageView) findViewById(R.id.imageView);

iv.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        //Agrega porcentajes de cada fraccion de grafica pastel

        Animation animFadein = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.fade_in);

        iv.startAnimation(animFadein);
    });

फ़ाइल में res/anim/fade_in.xml:

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

<alpha
    android:duration="100"
    android:fromAlpha="0.0"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:toAlpha="1.0" />
 </set>

महान समाधान - धन्यवाद! मैं इस पोस्ट के माध्यम से सभी संक्षिप्त लोगों की कोशिश कर रहा हूँ - और कोई सफलता नहीं। अंत में मैं यहां पहुंच गया और इसने मेरे लिए काम किया। एक अवलोकन - यदि आपके पास 2+ बटन हैं, तो आप एनीमेशन को अपनी ओर लागू करना चाहते हैं .. अपने कोड के लिए, मैंने पाया कि मुझे प्रत्येक बटन के लिए एनीमेशन ऑब्जेक्ट का एक अनूठा उदाहरण बनाने की आवश्यकता है जिसके लिए मैं प्रभाव लागू करना चाहता था। एक ही उदाहरण का पुन: उपयोग करने पर सभी बटन झिलमिलाने लगे जब 1 क्लिक किया गया था।
जीन बो

9

ImageView के लिए चयन करने योग्य पृष्ठभूमि सेट करें और कुछ गद्दी जोड़ें। फिर संलग्न करें OnClickListener

<ImageView
    android:id="@+id/your_image_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/your_image"
    android:padding="10dp"
    android:background="?android:attr/selectableItemBackground"/>

क्या पैडिंग सेट किए बिना इसका उपयोग करने का एक तरीका है, और पूरे ImageView को प्रभावित करना है और न केवल खाली क्षेत्र?
एंड्रॉइड डेवलपर

यह क्यूबिक में तरंग दिखाएगा, हमें केंद्र तरंग की आवश्यकता है
किशन सोलंकी

8

चयनकर्ता को ड्रा करने योग्य विकल्प को परिभाषित करने के लिए

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true"   
        android:drawable="@drawable/img_down" />
    <item android:state_selected="false"   
        android:drawable="@drawable/img_up" />
</selector>

मुझे एंड्रॉइड का उपयोग करना है: android के बजाय State_pressed: state_selected

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

5

आप android:background="@android:drawable/list_selector_background" डिफ़ॉल्ट "अलार्म घड़ी" (अब डेस्क घड़ी) में "अलार्म जोड़ें" के समान प्रभाव प्राप्त करने की कोशिश कर सकते हैं।


5

यदि आप टैप करते समय लहर चाहते हैं, तो यह इस कोड द्वारा दिया जा सकता है:

<ImageView
    ...
    android:background="?attr/selectableItemBackgroundBorderless"
    android:clickable="true"
    ...
</ImageView>

इसी तरह, आप TextView के लिए क्लिक प्रभाव लागू कर सकते हैं

<TextView
    ...
    android:background="?attr/selectableItemBackgroundBorderless"
    android:clickable="true"
    ...
</TextView>

4

यह मेरे लिए काम किया:

img.setOnTouchListener(new OnTouchListener(){

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction())
                {
                    case MotionEvent.ACTION_DOWN:
                    {
                        ((ImageView)v).setImageAlpha(200);
                        break;
                    }
                    case MotionEvent.ACTION_MOVE:
                    {
                        // if inside bounds
                        if(event.getX() > 0 && event.getX() < v.getWidth() && event.getY() > 0 && event.getY() < v.getHeight())
                        {
                            ((ImageView)v).setImageAlpha(200);
                        }
                        else
                        {
                            ((ImageView)v).setImageAlpha(255);
                        }

                        break;
                    }
                    case MotionEvent.ACTION_UP:
                    {
                        ((ImageView)v).setImageAlpha(255);
                    }
                }
                return true;
            }

        });

@ ईडिट: जैसा कि गुहान ने कहा कि सेटआईमैजएलएलपीए पद्धति के साथ बैकवर्ड कम्पेटिबिलिटी की समस्या होगी। मैंने इस विधि का उपयोग किया है:

public static void setImageAlpha(ImageView img, int alpha)
    {
        if(Build.VERSION.SDK_INT > 15)
        {
            img.setImageAlpha(alpha);
        }
        else
        {
            img.setAlpha(alpha);
        }
    }

1
setImageAlpha के लिए एपीआई स्तर 16 की आवश्यकता होती है। इसलिए, पिछड़े संगत ऐप्स के लिए इसका उपयोग संभव नहीं है
Gunhan

1
@ गुंजन वास्तव में, आप "नौOldAndroids" लाइब्रेरी का उपयोग कर सकते हैं, जो पुराने एपीआई पर भी अल्फा का उपयोग करने की अनुमति देता है। बस उपयोग करें: ViewHelper.setAlpha (दृश्य, अल्फा);
Android डेवलपर

4

मैं कुछ ऐसी ही चीजें करता हूं जो आपके लिए उपयुक्त हैं या नहीं

प्रेस प्रभाव हेल्पर देखें:

  • उपयोग: आईओएस की तरह कुछ सरल प्रेस प्रभाव करते हैं

    सरल उपयोग:

  • ImageView img = (ImageView) findViewById (R.id.img);

  • ViewPressEffectHelper.attach (img)

https://gist.github.com/extralam/7489370


4

ऊपर दिए गए सभी उत्तरों के संयोजन में, मैं चाहता था कि ImageView दबाया जाए और राज्य को बदल दिया जाए, लेकिन यदि उपयोगकर्ता स्थानांतरित हो गया तो "रद्द करें" और ऑनक्लीस्टलिस्टर न करें।

मैंने कक्षा के भीतर एक पॉइंट ऑब्जेक्ट बनाने और उपयोगकर्ता के ImageView पर नीचे धकेल दिए जाने के अनुसार अपने निर्देशांक सेट करने का काम किया। MotionEvent.ACTION_UP पर मैं एक नया बिंदु रिकॉर्ड कर रहा हूं और अंकों की तुलना करता हूं।

मैं केवल इसे इतनी अच्छी तरह से समझा सकता हूं, लेकिन यहां मैंने वही किया है।

// set the ontouch listener
weatherView.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // Determine what action with a switch statement
        switch (event.getAction()) {

        // User presses down on the ImageView, record the original point
        // and set the color filter
        case MotionEvent.ACTION_DOWN: {
            ImageView view = (ImageView) v;

            // overlay is black with transparency of 0x77 (119)
            view.getDrawable().setColorFilter(0x77000000,
                    PorterDuff.Mode.SRC_ATOP);
            view.invalidate();

            p = new Point((int) event.getX(), (int) event.getY());
            break;
        }

        // Once the user releases, record new point then compare the
        // difference, if within a certain range perform onCLick
        // and or otherwise clear the color filter
        case MotionEvent.ACTION_UP: {
            ImageView view = (ImageView) v;
            Point f = new Point((int) event.getX(), (int) event.getY());
            if ((Math.abs(f.x - p.x) < 15)
                    && ((Math.abs(f.x - p.x) < 15))) {
                view.performClick();
            }
            // clear the overlay
            view.getDrawable().clearColorFilter();
            view.invalidate();
            break;
        }
        }
        return true;
    }
});

मेरे पास छवि दृश्य पर एक onClickListener सेट है, लेकिन यह एक तरीका हो सकता है।


MotionEvent.ACTION_CANCELउसी कार्यक्षमता के साथ मामला जोड़कर MotionEvent.ACTION_UPतब दृश्य को "साफ़" करना संभव है यदि उपयोगकर्ता एक "ड्रैग" करता है जो एक क्लिक क्रिया नहीं है।
मंडो स्टाम

4

आप setPressedOnTouchEvent श्रोताओं को बनाने के बजाय ImageView में ओवरराइड कर सकते हैं और वहां कलर फिल्टरिंग कर सकते हैं:

@Override
public void setPressed(boolean pressed) {
    super.setPressed(pressed);

    if(getDrawable() == null)
        return;

    if(pressed) {
        getDrawable().setColorFilter(0x44000000, PorterDuff.Mode.SRC_ATOP);
        invalidate();
    }
    else {
        getDrawable().clearColorFilter();
        invalidate();
    }
}

4

श्री ज़ोर्न के उत्तर के आधार पर , मैं अपने सार उपयोगिता वर्ग में एक स्थिर विधि का उपयोग करता हूं:

public abstract class Utility {
...

    public static View.OnTouchListener imgPress(){
        return imgPress(0x77eeddff); //DEFAULT color
    }

    public static View.OnTouchListener imgPress(final int color){
        return new View.OnTouchListener() {

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

                switch(event.getAction()) {

                    case MotionEvent.ACTION_DOWN: {
                        ImageView view = (ImageView) v;
                        view.getDrawable().setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
                        view.invalidate();
                        break;
                    }

                    case MotionEvent.ACTION_UP:
                        v.performClick();

                    case MotionEvent.ACTION_CANCEL: {
                        ImageView view = (ImageView) v;

                        //Clear the overlay
                        view.getDrawable().clearColorFilter();
                        view.invalidate();
                        break;
                    }
                }

                return true;
            }
        };
    }

    ...
}

तो मैं इसे onTouchListener के साथ उपयोग करता हूं:

ImageView img=(ImageView) view.findViewById(R.id.image);
img.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) { /* Your click action */ }
});
img_zc.setOnTouchListener(Utility.imgPress()); //Or Utility.imgPress(int_color_with_alpha)

यदि आपके पास बहुत सारी छवियां हैं, तो यह बहुत सरल है, और आप बिना किसी एक्सएमएल ड्राबल और केवल एक छवि के बिना एक साधारण ऑनटच प्रभाव चाहते हैं।


3

एक का उपयोग करें android.widget.Button, और backgroundएक के लिए अपनी संपत्ति सेट करें android.graphics.drawable.StateListDrawable। यह सब XML में या प्रोग्रामेटिक रूप से किया जा सकता है। फॉर्म स्टफ ट्यूटोरियल का कस्टम बटन अनुभाग देखें ।



3

मुझे लगता है कि ImageButton एक बेहतर समाधान है

<ImageButton
    android:layout_width="96dp"
    android:layout_height="56dp"
    android:src="@mipmap/ic_launcher"
    android:adjustViewBounds="true"
    android:background="@android:color/transparent"
    android:foreground="@drawable/selector" />

2

यदि आप पृष्ठभूमि छवियों का उपयोग करते हैं तो मेरे पास एक और सौंदर्य समाधान है :)

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

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

2

या:

आप इस फॉर्म का उपयोग कर सकते हैं, इमेज बटन के साथ।

फ़ाइल बनाएँ res/drawable/btn_video.xml:

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

और res/layout/activity_main.xml:

<ImageButton
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/imageButton"
    android:layout_gravity="center_horizontal"
    android:onClick="eventImageBtn"
    android:background="@drawable/btn_video"
    android:adjustViewBounds="true"
    android:scaleType="fitXY"
/>

आपकी छवि एक क्लिक से बदल जाती है, और आप एक रेखीय लेआउट के साथ समायोजित कर सकते हैं:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:background="@color/menu_item_background">

        <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"
                      android:paddingLeft="@dimen/main_screen_side_padding" android:paddingRight="@dimen/main_screen_side_padding" android:paddingTop="@dimen/main_screen_side_padding" android:paddingBottom="@dimen/main_screen_side_padding"
                      android:background="#ffb3ff13" android:weightSum="10.00">


            <LinearLayout android:layout_weight="2.50" android:background="#ff56cfcd" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="0dp" >

                <ImageButton
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:id="@+id/imageButton"
                    android:layout_gravity="center_horizontal"
                    android:onClick="eventImageBtn"
                    android:background="@drawable/btn_video"
                    android:adjustViewBounds="true"
                    android:scaleType="fitXY"
                />
            </LinearLayout>

            <LinearLayout android:layout_weight="0.50" android:layout_height="0dp" android:background="#ffffffff" android:orientation="vertical" android:layout_width="fill_parent" >
            </LinearLayout>

            <LinearLayout android:layout_weight="4.50" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="0dp" android:background="#ff8aa5ff">
            </LinearLayout>

            <LinearLayout android:layout_weight="0.50" android:layout_height="0dp" android:background="#ffffffff" android:orientation="vertical" android:layout_width="fill_parent" >
            </LinearLayout>

            <LinearLayout android:layout_weight="2.00" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="0dp" android:background="#ffff7d1a" >
            </LinearLayout>

        </LinearLayout>
    </LinearLayout>
</ScrollView>

2

यहां मेरा समाधान है, जो " नौऑल्डअंडरॉयड्स " लाइब्रेरी का उपयोग करते हुए , पुराने एपीआई का भी समर्थन करता है:

rootView.setOnTouchListener(new OnTouchListener() {

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

        switch (event.getAction()) {

            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                v.setBackgroundResource(R.drawable.listview_normal);
                ViewHelper.setAlpha(imageView, 1);
                break;

            case MotionEvent.ACTION_DOWN:
                v.setBackgroundResource(0);
                v.setBackgroundColor(getResources().getColor(R.color.listview_pressed));
                ViewHelper.setAlpha(imageView, 0.75f);
                break;
        }
        return false;
    }
});

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


संपादित करें: यदि आप चाहें, तो आप अग्रभूमि को संभालने के लिए ImageView का विस्तार भी कर सकते हैं, और इसे "? Android: attr / selectableItemBackground" पर सेट कर सकते हैं। यहाँ इसके लिए एक पुस्तकालय है और आप इसे यहाँ कैसे भी देख सकते हैं, इसके लिए एक ट्यूटोरियल है


@madlymad कोड स्वरूपण को ठीक करने के लिए आपका धन्यवाद करता है, हालांकि मुझे लगता है कि इंडेंटेशन में कुछ गलत हुआ। वैसे भी, इसे पढ़ने में सक्षम होना काफी अच्छा है ...
Android डेवलपर

1

इस धागे पर मदद के लिए धन्यवाद। हालाँकि, आप एक चीज़ से चूक गए ... आपको ACTION_CANCEL को भी संभालना होगा। यदि आप ऐसा नहीं करते हैं, तो आप उस घटना में ImageView के अल्फा मान को ठीक से पुनर्स्थापित नहीं कर सकते हैं कि दृश्य पदानुक्रम में एक माता-पिता एक स्पर्श घटना (एक स्क्रॉल दृश्य आप ImageView लपेटता है) को स्वीकार करता है।

यहाँ एक पूर्ण वर्ग है जो उपरोक्त वर्ग पर आधारित है, लेकिन साथ ही ACTION_CANCEL का भी ध्यान रखता है। यह प्री-पोस्ट जेलीबीन एपीआई में अंतर को अमूर्त करने के लिए एक ImageViewCompat सहायक वर्ग का उपयोग करता है।

public class ChangeAlphaOnPressedTouchListener implements OnTouchListener {

    private final float pressedAlpha;

    public ChangeAlphaOnPressedTouchListener(float pressedAlpha) {
        this.pressedAlpha = pressedAlpha;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        ImageView iv = (ImageView) v;
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            ImageViewCompat.setAlpha(iv, pressedAlpha);
            break;

        case MotionEvent.ACTION_MOVE:
            if (isInsideViewBounds(v, event)) {
                ImageViewCompat.setAlpha(iv, pressedAlpha);
            } else {
                ImageViewCompat.setAlpha(iv, 1f);
            }
            break;
        case MotionEvent.ACTION_UP:
            ImageViewCompat.setAlpha(iv, 1f);
            break;
        case MotionEvent.ACTION_CANCEL:
            ImageViewCompat.setAlpha(iv, 1f);
        }
        return false;
    }

    private static boolean isInsideViewBounds(View v, MotionEvent event) {
        return event.getX() > 0 && event.getX() < v.getWidth() && event.getY() > 0
                && event.getY() < v.getHeight();
    }
}

1

यहाँ मेरा कोड है विचार यह है कि जब उपयोगकर्ता इसे छूता है तो ImageView को रंगीन फ़िल्टर मिलता है, और उपयोगकर्ता द्वारा इसे छूने से रोकने पर रंग फ़िल्टर हटा दिया जाता है।

मार्टिन बुका वेसर, एंड्रस, आह लाम, ऑल्टोश, सॉल्यूशन काम नहीं करता है जब ImageView ने भी ऑनक्लाइक किया है। worawee.s और kcoppock (ImageButton के साथ) समाधान के लिए पृष्ठभूमि की आवश्यकता होती है, जिसका कोई मतलब नहीं है जब ImageView पारदर्शी नहीं है।

यह रंग फिल्टर के बारे में AZ_ विचार का विस्तार है ।

class PressedEffectStateListDrawable extends StateListDrawable {

    private int selectionColor;

    public PressedEffectStateListDrawable(Drawable drawable, int selectionColor) {
        super();
        this.selectionColor = selectionColor;
        addState(new int[] { android.R.attr.state_pressed }, drawable);
        addState(new int[] {}, drawable);
    }

    @Override
    protected boolean onStateChange(int[] states) {
        boolean isStatePressedInArray = false;
        for (int state : states) {
            if (state == android.R.attr.state_pressed) {
                isStatePressedInArray = true;
            }
        }
        if (isStatePressedInArray) {
            super.setColorFilter(selectionColor, PorterDuff.Mode.MULTIPLY);
        } else {
            super.clearColorFilter();
        }
        return super.onStateChange(states);
    }

    @Override
    public boolean isStateful() {
        return true;
    }
}

उपयोग:

Drawable drawable = new FastBitmapDrawable(bm);
imageView.setImageDrawable(new PressedEffectStateListDrawable(drawable, 0xFF33b5e5));

1

मैंने कोशिश की:

<ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@string/get_started"
        android:src="@drawable/home_started"
        style="?android:borderlessButtonStyle"
        android:adjustViewBounds="true"
        android:clickable="true"
        android:elevation="5dp"
        android:longClickable="true" />

और यह काम किया। कृपया लाइन पर ध्यान दें:style="?android:borderlessButtonStyle"


यह 0 गद्दी के मामले में काम नहीं करता है और छवि दृश्य के पूरे क्षेत्र को लेती है।
Android डेवलपर

1

मुझे लगता है कि सबसे आसान तरीका एक नई XML फ़ाइल बना रहा है। इस स्थिति में, हम इसे "example.xml" ड्रा करने योग्य फ़ोल्डर में कॉल करते हैं, और अनुसरण कोड में डालते हैं:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/blue"
          android:state_pressed="true" />

</selector>

लेकिन इससे पहले आपको मूल्यों में फ़ोल्डर में color.xml फ़ाइल में रंग सेट करना होगा, जैसे:

<resources>
    <color name="blue">#0000FF</color>
</resources>

इसने, आपने इस तरह से नए लेआउट का उपयोग करने के लिए बस बटन / इमेजबटन सेट किया है:

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/example"
/>

फिर जब आप उस छवि पर क्लिक करते हैं, तो यह रंग सेट में बदल जाएगा

<item android:drawable="@color/blue"
      android:state_pressed="true" />

आप जो प्रतिक्रिया चाहते हैं ...


1

यह मैंने कभी देखा सबसे अच्छा समाधान है। इसके अधिक सामान्य है।

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

    <alpha
        android:duration="100"
        android:fromAlpha="0.0"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:toAlpha="1.0" />
</set>

2
किस स्थान और फ़ाइल में इसे इंजेक्ट किया जाना चाहिए?
दिमित्रीबॉयको

0

मैं के रूप में XML में इस प्रकार था - साथ 0 गद्दी छवि और लहर के आसपास ontop छवि के:

<ImageView
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:background="@drawable/my_image"
    android:clickable="true"
    android:focusable="true"
    android:src="?android:attr/selectableItemBackground" />


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