অ্যান্ড্রয়েডের বোতামের মতো আমি কীভাবে একটি চিত্রদর্শন ক্লিক প্রভাব দিতে পারি?


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

4
আপনি কী ব্যাখ্যা করতে পারবেন রেজিট্রেটেবলের রেস এটি কী করে?
ভেনুশকাট

v.setSelected শুধুমাত্র == একবারে সত্য হবে, মোশনএভেন্টের কারণে তাত্ক্ষণিক মিথ্যাতে চলে যাবে CTION অ্যাকশন_মোভ। একবার আঙুলটি প্রকাশিত হয়ে গেলে মোশনইভেন্ট Eঅ্যাকশন_আপ হয়। যদি নির্বাচক পদ্ধতিটি ব্যবহার করা হয় তবে সেটলেসেটেড বা সেটপ্রেসড করতে পৃথক যুক্তি ব্যবহার করুন। if (arg1.getAction () == মোশনএভেন্ট.এ্যাকশন_ডাউন)। v.setPressed (সত্য); if অন্যথায় যদি (arg1.getAction () == মোশনএভেন্ট। }
অ্যাডাম ডেনুন

MotionEvent.ACTION_DOWN || MotionEvent.ACTION_MOVEআমরা যতক্ষণ চাপ দিচ্ছি ততক্ষণ চিত্রটি প্রদর্শিত রাখা ভাল ।
আলা এম।

আপনার দরকার নেই setOnTouchListener(...। আপনি কেবল <selector ...>এটিকে তৈরি করতে পারেন এবং তারপরে এক্সএমএলে চিত্রের দৃশ্য ক্লিকযোগ্য সেট করতে পারেন<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;
        }
    });

সহজেই পুনরায় ব্যবহারযোগ্যতার জন্য আমি সম্ভবত এটি চিত্রবিউজের একটি সাবক্লাসে তৈরি করব (বা এটি চিত্রকল্পের একটি সাবক্লাসও হ'ল) ​​তবে এটি আপনাকে চিত্রকল্পে "নির্বাচিত" চেহারা প্রয়োগ করার অনুমতি দেবে।


4
আমি অ্যাকশন_স্যানসেলের জন্যও একটি কেস যুক্ত করেছি, এটি দুর্দান্ত কাজ করে, ধন্যবাদ!
অ্যালান

ভাল কল - আমি নিজের কোডে নিজেকে যুক্ত করেছিলাম তবে এটি এখানেও আপডেট করব।
মিঃ জর্ন

4
এটি অন্য একটি প্রশ্ন হতে পারে তবে আমি কীভাবে ACTION_UP এর পরে বাতিল করব? বিশেষত ... ব্যবহারকারী চিত্রটি হিট করে। ব্যবহারকারী বাতিল করতে চিত্রটি আঙুল থেকে টেনে আনেন। তবে এই কোডটি দিয়ে পদক্ষেপ বাতিল করা হয়নি
সুডোকোডার

আমি মোশনএভেন্টও যোগ করব Aঅ্যাকশন_আউটিএসইডি;)
Bonnyz

4
আপনি ফিরে আসতে চাইতে পারেন false, অন্যথায় দেখার আসল onClick()ঘটনাটি বরখাস্ত করা হবে না
নিমরোদ দয়ান

45

কালারফিল্টার পদ্ধতিটি ব্যবহার করে কেবল একটি চিত্র ফাইল দিয়ে করা সম্ভব । যাইহোক, কালারফিল্টার বাটনগুলি নয় চিত্রাবলীর সাথে কাজ করার প্রত্যাশা করে, তাই আপনাকে আপনার বোতামগুলি ইমেজভিউতে রূপান্তর করতে হবে। আপনি যেভাবেই ইমেজগুলি আপনার বোতাম হিসাবে ব্যবহার করছেন এটি কোনও সমস্যা নয় তবে আপনি যদি পাঠ্য পেয়ে থাকেন তবে এটি আরও বিরক্তিকর ... যাইহোক, আপনি পাঠ্যের সাহায্যে সমস্যার কোনও উপায় খুঁজে পেয়েছেন, ধরে নেওয়ার কোডটি এখানে রেখেছেন:

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

এটি বোতামটিতে একটি লাল ওভারলে প্রযোজ্য (রঙিন কোডটি সম্পূর্ণ অস্বচ্ছ লাল জন্য হেক্স কোড - প্রথম দুটি অঙ্ক স্বচ্ছতা, তারপরে এটি আরআর জিজি বিবি))।


4
আপনি কি দয়া করে ব্যাখ্যা করতে পারেন যে কোডটি দৌড়ানোর পরে কী ঘটবে, এবং এটি যেখানে কল করার ইচ্ছা রয়েছে? আমি এই 2 লাইনটি চিত্রভিউ সূচনাতে কল করার চেষ্টা করেছি - এটি আমার চিত্রটিকে লাল রঙ করে এবং তারপরে ক্লিক বা ত্বকেও কিছুই হয় না। স্পর্শে কল করার সময় একই।
সম্মানের সাথে

45

সম্পাদনা : যদিও নীচের মূল উত্তরটি কাজ করে এবং সেট আপ করা সহজ, আপনি যদি আরও দক্ষ প্রয়োগের প্রয়োজন চান তবে গুগলে অ্যান্ড্রয়েড বিকাশকারী অ্যাডভোকেট এই পোস্টটি দেখুন refer এছাড়াও মনে রাখবেন android:foregroundঅ্যাট্রিবিউট সকল দৃশ্য আসছে অ্যান্ড্রয়েড এম এ ImageView সহ, ডিফল্ট অনুসারে


ইমেজভিউয়ের জন্য নির্বাচক ব্যবহার করার ক্ষেত্রে সমস্যাটি হ'ল আপনি এটিকে কেবল দেখার ব্যাকগ্রাউন্ড হিসাবে সেট করতে পারবেন - যতক্ষণ না আপনার চিত্র অস্বচ্ছ, আপনি তার পিছনে নির্বাচকটির প্রভাব দেখতে পাবেন না।

কৌশলটি হ'ল বৈশিষ্ট্যযুক্ত একটি ফ্রেমলাউট আপনার চিত্রবিউজকে মোড়ানো android:foregroundযা আমাদের এর সামগ্রীর জন্য ওভারলে সংজ্ঞায়িত করতে দেয় । যদি আমরা android:foregroundকোনও নির্বাচককে সেট করি (উদাহরণস্বরূপ ?android:attr/selectableItemBackground, এপিআই স্তর 11+ এর জন্য) এবং OnClickListenerচিত্রটি ভিউয়ের পরিবর্তে ফ্রেম-লেআউটে এটিকে সংযুক্ত করি , তবে চিত্রটি আমাদের নির্বাচকের অঙ্কনীয় - আমাদের পছন্দ ক্লিকের প্রভাব দিয়ে আবৃত হবে!

দেখুন:

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

4
দুর্দান্ত! এটি একটি খুব ভাল সমাধান। এসএমএস বা কল ক্রিয়াকলাপগুলির জন্য পরিচিতি অ্যাপ্লিকেশনটিতে একই সমাধান।
জেরি

এপিআই <11? এ অ্যান্ড্রয়েড: অ্যাট্রয়েড / নির্বাচনযোগ্য
আইটেমব্যাকগ্রাউন্ডের

selectableItemBackgroundঅ্যাট্রিবিউট শুধুমাত্র এপিআই স্তর 11 যোগ করা হয়েছিল যাতে আপনার পুরোনো API লেভেলের জন্য এই সমাধান ব্যবহার করতে চান তাহলে অন্য নির্বাচক ব্যবহার করা আবশ্যক। উদাহরণস্বরূপ, আমার অ্যাপ্লিকেশনগুলির মধ্যে একটি যা এপিআই স্তরের 7 সমর্থন করে, আমি অ্যান্ড্রয়েড হলো কালার জেনারেটর সরঞ্জাম@drawable/list_selector_holo_light ব্যবহার করে উত্পন্ন উত্সটি ব্যবহার করি ।
Justasm

আপনি কেবল <ImageButton>নির্বাচনযোগ্য আইটেমব্যাকগ্রাউন্ড সহ 1 টি ব্যবহার করে একই আচরণ অর্জন করতে পারেন !
যোহন দহমনি

28

এক্সএমএল ফাইলে স্টাইল = "? অ্যান্ড্রয়েড: সীমান্তহীন বাটন স্টাইল" ব্যবহার করুন। এটি অ্যান্ড্রয়েড ডিফল্ট ক্লিক প্রভাব প্রদর্শন করবে।

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

4
এটি আসলে সবচেয়ে ভাল উত্তর, খুব সহজ
ফ্রাঙ্কমঞ্জা

4
এটি প্যাডিং সেট করে এবং আপনি প্যাডিংটি 0 তে সেট করেও, আপনার দেওয়া চিত্রটি যদি পুরো চিত্রটি নেয় তবে আপনি ক্লিক করার কোনও প্রভাব দেখতে পাবেন না।
অ্যান্ড্রয়েড বিকাশকারী

4
android:adjustViewBounds="true"প্যাডিং আনসেট করতে অ্যান্ড্রয়েড ডেভেলপার ব্যবহার করুন ।
হাফেজ দিবান্ডারী

4
এটি ব্যবহারের পরামর্শ দেওয়া হচ্ছে style="?android:attr/borderlessButtonStyle": developer.android.com/guide/topics/ui/controls/…
হাফেজ ডিভান্ডারি

style="?android:actionButtonStyle"অ্যাকশনবার বা সরঞ্জামদণ্ডে ক্লিকযোগ্যযোগ্য চিত্রকল্পের জন্য ব্যবহার করুন ।
palindrom

21

কেবলমাত্র একটি ইমেজবটন ব্যবহার করুন ।


4
আমি ব্যক্তিগতভাবে এটিকে ইমেজভিউয়ের মতো দেখতে পারি না। কোনও সীমানা নয়, চিত্রটি বাটন ইমেজবটন ইত্যাদি আকারে প্রসারিত করুন যদি আপনি এই সীমানা এবং প্রসারিত সমস্যাটি দিতে পারেন, এবং আপনার পোস্ট আপডেট করুন। আমার কিছু খ্যাতি আপনার কাছে অনুগ্রহ হিসাবে চলে যায় =)
মোট

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

ইমেজভিউতে বাছাইযোগ্য পটভূমি সেট করুন এবং কিছু প্যাডিং যুক্ত করুন। তারপরে সংযুক্ত করুন 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"/>

প্যাডিং সেট না করে এটিকে ব্যবহার করার কোনও উপায় আছে এবং পুরো খালি ইমেজভিউতে খালি অঞ্চলটিই নয়, এর প্রভাব পড়ে?
অ্যান্ড্রয়েড বিকাশকারী

এটি কিউবিকের মধ্যে ফুটো দেখাবে, আমাদের সেন্টার রিপল দরকার
কিশান সোলঙ্কি

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>

আমাকে অ্যান্ড্রয়েড ব্যবহার করতে হবে: অ্যান্ড্রয়েডের পরিবর্তে রাষ্ট্র_প্রেসিত: 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>

6

আপনি যদি আলতো চাপতে চান তবে আপনি এই কোডটি দিয়ে দিতে পারেন:

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

একইভাবে, আপনি টেক্সটভিউয়ের জন্য ক্লিক প্রভাব প্রয়োগ করতে পারেন

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

5

আপনি android:background="@android:drawable/list_selector_background" ডিফল্ট "অ্যালার্ম ক্লক" (এখন ডেস্ক ক্লক) "এলার্ম যুক্ত করুন" এর মতো একই প্রভাব পেতে চেষ্টা করতে পারেন।


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

4
সেট ইমেজআল্ফার জন্য এপিআই স্তর 16 প্রয়োজন 16 অতএব, পশ্চাদপদ সামঞ্জস্যপূর্ণ অ্যাপ্লিকেশনগুলির জন্য এটি ব্যবহার করা সম্ভব নয়
গুণান

4
@ গুনহান আসলে আপনি "নাইন ওল্ডঅ্যান্ড্রয়েডস" লাইব্রেরি ব্যবহার করতে পারেন যা পুরানো এপিআইগুলিতে এমনকি আলফা ব্যবহারের অনুমতি দেয়। শুধু ব্যবহার করুন: ভিউহেল্পার.সেটআল্ফা (দেখুন, আলফা);
অ্যান্ড্রয়েড বিকাশকারী

4

আমি কিছু অনুরূপ জিনিস আপনার জন্য উপযুক্ত না দেখুন

প্রেস এফেক্ট হেল্পার দেখুন:

  • ব্যবহার: আইওএসের মতো কিছু সাধারণ প্রেস এফেক্ট করুন

    সাধারণ ব্যবহার:

  • ইমেজভিউ img = (ইমেজভিউ) সন্ধান ভিউবিআইআইডি (আর.আইডি.আইএমজি);

  • ভিউপ্রেসএফেক্টহেলপার.এটাচ (আইএমজি)

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


4

উপরের সমস্ত উত্তরের সাথে একত্রে, আমি চাইছিলাম যে চিত্রটি দেখুন টিপুন এবং পরিবর্তিত রাষ্ট্র হোক তবে যদি ব্যবহারকারী সরানো থাকে তবে "বাতিল করুন" এবং অনক্লিকলিস্টনার সম্পাদন না করে।

আমি ক্লাসের মধ্যে একটি পয়েন্ট অবজেক্ট তৈরি করেছি এবং যখন ব্যবহারকারী ইমেজভিউতে নামাবেন তখন অনুযায়ী এর স্থানাঙ্কগুলি সেট করুন। মোশনইভেন্টে। অ্যাকশন_আপে আমি একটি নতুন পয়েন্ট রেকর্ড করেছি এবং পয়েন্টগুলি তুলনা করছি।

আমি কেবল এটি এত ভাল ব্যাখ্যা করতে পারি, তবে আমি যা করেছি তা এখানে।

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

ইমেজভিউতে আমার অনক্লিকলিস্টনার সেট আছে তবে এটি কোনও পদ্ধতি হতে পারে।


তারপরে MotionEvent.ACTION_CANCELএকই কার্যকারিতা সহ কেস যুক্ত করে যদি MotionEvent.ACTION_UPব্যবহারকারীরা কোনও "টানুন" সম্পাদন করেন যা ক্লিক অ্যাকশন নয়।
পাগলামি

4

আপনি setPressedইচ্ছুকভিউতে ওভাররাইড করতে পারেন এবং সেখানে রঙিন ফিল্টারিং করতে পারেন, টুচেন্ট শ্রোতাদের তৈরি করার পরিবর্তে:

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

    ...
}

তারপরে আমি এটি টাচলিস্টনার দিয়ে ব্যবহার করব:

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। এটি সব এক্সএমএল বা প্রোগ্রামগতভাবে করা যেতে পারে। ফর্ম স্টাফ টিউটোরিয়ালের কাস্টম বোতাম বিভাগটি দেখুন ।



3

আমি মনে করি ইমেজবটন একটি আরও ভাল সমাধান

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

এটি ধরে নেয় যে রুটভিউটি সেলটি নিজেই (বিন্যাস), এবং এটিতে একটি একক চিত্র রয়েছে যা আপনি পুরো ঘরে প্রয়োগ করতে চান এমন রঙ দ্বারা প্রভাবিত হতে চান।


সম্পাদনা: আপনি যদি চান, আপনি অগ্রভাগ পরিচালনা করতে ইমেজভিউও প্রসারিত করতে পারেন এবং এটিকে "? Android: attr / selectableItemBackground" এ সেট করতে পারেন। এই জন্য একটি লাইব্রেরী এখানে এবং কিভাবে কোন দৃশ্য ইচ্ছা, তা করতে হবে সেই বিষয়ে একটি টিউটোরিয়াল এখানে


@ এমড্ল্যামেড কোড ফরম্যাটিং ঠিক করার জন্য আপনাকে ধন্যবাদ, যদিও আমি মনে করি ইনডেন্টেশনে কিছু ভুল হয়েছে। যাইহোক, এটি পড়তে সক্ষম হওয়ার পক্ষে এটি যথেষ্ট ভাল ...
অ্যান্ড্রয়েড বিকাশকারী

1

এই থ্রেডে সাহায্যের জন্য ধন্যবাদ। তবে, আপনি একটি জিনিস মিস করেছেন ... আপনার পাশাপাশি ACTION_CANCEL পরিচালনা করতে হবে। যদি আপনি না করেন তবে আপনি সম্ভবত চিত্রাবলীর আলফা মানটি সেই ইভেন্টে ঠিকঠাকভাবে পুনরুদ্ধার করতে পারবেন না যা দৃশ্যের পিতামাতার দর্শনটি কোনও স্পর্শ ইভেন্টকে বাধা দেয় (ভাবুন কোনও স্ক্রোলভিউ আপনার চিত্রের ভিউ মোড়ানো)।

এখানে একটি সম্পূর্ণ শ্রেণি রয়েছে যা উপরের শ্রেণীর উপর ভিত্তি করে তবে ACTION_CANCEL এরও যত্ন করে। এটি প্রাক-পোস্ট জেলিবিয়ান এপিআই-এর পার্থক্য বিমূর্ত করতে একটি চিত্রভিউকম্প্যাট সহায়ক শ্রেণি ব্যবহার করে।

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

এখানে আমার কোড। ধারণাটি হ'ল ব্যবহারকারীরা এটি স্পর্শ করলে চিত্র চিত্রটি রঙিন ফিল্টার পায় এবং ব্যবহারকারী যখন এটি স্পর্শ করা বন্ধ করে দেয় তখন রঙিন ফিল্টার সরিয়ে ফেলা হয়।

মার্টিন বুকা ওয়েজার, অ্যান্ড্রেস, আহ লাম, ইলতোশ, যখন সমাধানটি কাজ করে না যখন ইমেজভিউতেও ক্লিক ক্লাব রয়েছে। worawee.s এবং kcoppock (ইমেজবটন সহ) সমাধানের জন্য পটভূমি প্রয়োজন, যখন ইমেজভিউ স্বচ্ছ নয় তখন এর কোনও ধারণা নেই।

এটি রঙিন ফিল্টার সম্পর্কে 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 টি প্যাডিংয়ের ক্ষেত্রে কাজ করে না এবং চিত্রটি পুরো দর্শনীয় অঞ্চলটিকে নিয়ে যায়।
অ্যান্ড্রয়েড বিকাশকারী

1

আমি মনে করি সবচেয়ে সহজ উপায়টি একটি নতুন এক্সএমএল ফাইল তৈরি করছে। এই ক্ষেত্রে, আসুন অঙ্কনযোগ্য ফোল্ডারে এটি "উদাহরণ.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>

4
কোন জায়গায় এবং ফাইলটিতে এটি ইঞ্জেকশন করা উচিত?
দিমিত্রিবয়কো

0

আমি এক্সএমএলে নিম্নলিখিত হিসাবে করেছি - ইমেজটির চারপাশে 0 টি প্যাডিং এবং চিত্রের শীর্ষে রিপল :

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


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.