অ্যান্ড্রয়েড: অন ইন্টারসেপ্টিউচইচেন্ট এবং ডিসপ্যাচ টাচ ইভেন্টের মধ্যে পার্থক্য?


249

অ্যান্ড্রয়েড onInterceptTouchEventএবং এর dispatchTouchEventমধ্যে পার্থক্য কী ?

অ্যান্ড্রয়েড বিকাশকারী গাইড অনুসারে, কোনও স্পর্শ ইভেন্ট ( MotionEvent) বাধা দেওয়ার জন্য দুটি পদ্ধতিই ব্যবহার করা যেতে পারে , তবে পার্থক্য কী?

কীভাবে onInterceptTouchEvent, dispatchTouchEventএবং onTouchEventভিউ ( ViewGroup) এর শ্রেণিবিন্যাসের মধ্যে একসাথে ইন্টারঅ্যাক্ট করবেন ?

উত্তর:


272

এটি নির্মূল করার সর্বোত্তম জায়গা হ'ল উত্স কোড। এটি ব্যাখ্যা করার জন্য ডকসটি খুব খারাপভাবেই অপ্রতুল।

dispatchTouchEvent আসলে কার্যকলাপ, দেখুন এবং দেখুন গ্রুপে সংজ্ঞায়িত হয়। এটিকে কোনও নিয়ামক হিসাবে ভাবুন যা স্পর্শ ইভেন্টগুলিকে কীভাবে রুট করবেন dec

উদাহরণস্বরূপ, সর্বাধিক সহজ ঘটনাটি ভিউ.ডিসপ্যাচটচ এভেন্টের এটি যা স্পর্শ ইভেন্টটিকে অনটচলাইস্টেনার.অনুচকে অন্যথায় সংযুক্ত করে যদি এটি সংজ্ঞায়িত হয় বা টুচভেন্টে এক্সটেনশন পদ্ধতিতে নিয়ে আসে

জন্য ViewGroup.dispatchTouchEvent জিনিষ পথ আরো জটিল। এর কোন শিশু দর্শনটি ইভেন্টটি পাওয়া উচিত তা সনাক্ত করা দরকার (চাইল্ড.ডিসপ্যাচটচ এভেন্টে ফোন করে)। এটি মূলত একটি হিট টেস্টিং অ্যালগরিদম যেখানে আপনি সনাক্ত করেছেন যে কোন শিশু দর্শনটির সীমানা আয়তক্ষেত্রটিতে টাচ পয়েন্টের স্থানাঙ্ক রয়েছে।

তবে ইভেন্টটি যথাযথ শিশু দৃষ্টিতে প্রেরণের আগে পিতামাতা সমস্ত একসাথে ইভেন্টটি গুপ্তচর এবং / বা বিরত করতে পারবেন। এই কি onInterceptTouchEvent নেই। সুতরাং এটি হিট টেস্টিং করার আগে এই পদ্ধতিটিকে প্রথমে কল করে এবং যদি ইভেন্টটি হাইজ্যাক হয়ে যায় (onInterceptTouchEvent থেকে সত্য ফিরে এসে) এটি শিশুদের দৃশ্যে ACTION_CANCEL প্রেরণ করে যাতে তারা তাদের স্পর্শ ইভেন্ট প্রক্রিয়াটিকে (পূর্ববর্তী স্পর্শ ইভেন্টগুলি থেকে) পরিত্যাগ করতে পারে প্যারেন্ট লেভেলের সমস্ত স্পর্শ ইভেন্টগুলি টুচলিস্টনার.অন টাচ (যদি সংজ্ঞায়িত করা হয়) বা অন ​​টাচএভেন্টে () পাঠানো হয় । এছাড়াও সেক্ষেত্রে, অন্টরেসেপ্টউচ এভেন্টকে আর কখনও ডাকা হয় না।

এমনকি আপনি কি [ক্রিয়াকলাপ | দেখুন গোষ্ঠী | দেখুন] .ডিস্পপ্যাচটচ এভেন্ট্রাইড করতে চান? আপনি যদি কিছু কাস্টম রাউটিং না করেন তবে আপনার উচিত হবে না।

প্রধান এক্সটেনশন পদ্ধতিগুলি হ'ল ভিউগ্রুপ.অনন্টারসেপ্ট টাচ ইভেন্ট যদি আপনি পিতামাতৃ স্তরে স্পাই এবং / অথবা ইন্টারসেপ্ট স্পর্শ ইভেন্টটি করতে চান এবং মূল ইভেন্ট হ্যান্ডলিংয়ের জন্য View.onTouchListener / View.onTouchEvent চান।

এর সবকটি জটিল ডিজাইনের ইমো তবে অ্যান্ড্রয়েড এপিস সরলতার চেয়ে নমনীয়তার দিকে বেশি ঝুঁকছে।


10
এটি একটি দুর্দান্ত, সংক্ষিপ্ত উত্তর। আরও বিশদ উদাহরণের জন্য, "একটি ভিউ গ্রুপে টাচ ইভেন্টগুলি পরিচালনা করা"
টকলিটল

1
@ নূমান সালাতী: "এরপরে থেকে পিতামাতার স্তরের সমস্ত স্পর্শ ইভেন্টগুলি টুচলিস্টনার.অন টাচ-এ প্রেরণ করা হয়েছে" - আমি আমার ভিউ গ্রুপে প্রেরণ স্পর্শ পদ্ধতিটি ওভাররাইড করতে এবং এটি ইভেন্টগুলি টুচলিস্টনারে প্রেরণ করতে চাই। তবে কীভাবে এটি করা যায় তা আমি দেখছি না। View.getOnTouchListener ()। OnTouch () এর মতো এপিআই নেই। এখানে একটি সেটঅনটচলিস্টনার () পদ্ধতি আছে তবে getOnTouchListener () পদ্ধতি নেই। তাহলে কীভাবে এটি করা যায়?
আশ্বিন

@ অশ্বিন আমার মতামতগুলি ঠিক বলেছেন, সেখানে কোনও অনিরসেপ্টচ্যাচ সেট নেই। কোনও লেআউটে ব্যবহারের জন্য / কোডে এটি যুক্ত করার জন্য আপনি একটি সাবক্লাস ভিউ ওভাররাইড করতে পারেন, তবে আপনি খণ্ড / ক্রিয়াকলাপ-স্তরের রুটভিউগুলি নিয়ে গোলমাল করতে পারবেন না, যেহেতু খণ্ড / ক্রিয়াকলাপ নিজেই সাবক্লাসিং ছাড়াই আপনি এই দর্শনগুলিকে সাবক্লাস করতে পারবেন না (বেশিরভাগ সামঞ্জস্যের মতো) প্রগ্রেসিটিভিটি বাস্তবায়ন)। সরলতার জন্য এপিআই-এর একটি সেটঅন্টিন্টারসেপ্ট টাচ ইভেন্ট দরকার। অর্ধ-জটিল অ্যাপ্লিকেশনটির কিছু সময়ে প্রত্যেকে রুটভিউগুলিতে ইন্টারসেপ্ট টাচ ব্যবহার করে
leRobot

244

কারণ গুগলে এটি প্রথম ফলাফল। আমি আপনার সাথে উপর ডেভ স্মিথ একটি দুর্দান্ত টক ভাগ করতে চান ইউটিউব: Android এর টাচ সিস্টেম নিয়ন্ত্রণ এবং স্লাইডস পাওয়া যায় এখানে । এটি আমাকে অ্যান্ড্রয়েড টাচ সিস্টেম সম্পর্কে ভাল গভীর ধারণা দিয়েছে:

কিভাবে ভ্রমণ হ্যান্ডলগুলি স্পর্শ:

  • Activity.dispatchTouchEvent()
    • সর্বদা ডাকা হবে
    • উইন্ডোতে সংযুক্ত রুট ভিউতে ইভেন্ট পাঠায়
    • onTouchEvent()
      • কোনও মতামত ইভেন্টটি গ্রাস না করে বলে ডাকা হয়
      • সর্বদা বলা শেষ

কিভাবে দেখুন হ্যান্ডলগুলি স্পর্শ:

  • View.dispatchTouchEvent()
    • উপস্থিত থাকলে প্রথমে শ্রোতাদের কাছে ইভেন্ট পাঠায়
      • View.OnTouchListener.onTouch()
    • যদি সেবন না হয় তবে স্পর্শটি নিজেই প্রক্রিয়া করে
      • View.onTouchEvent()

একটি ভিউগ্রুপ কীভাবে স্পর্শ পরিচালনা করে:

  • ViewGroup.dispatchTouchEvent()
    • onInterceptTouchEvent()
      • এটি বাচ্চাদের উপেক্ষা করা উচিত কিনা তা পরীক্ষা করে দেখুন
      • ACTION_CANCEL সক্রিয় সন্তানের পাস
      • যদি এটি একবারে সত্য হয় তবে ViewGroupপরবর্তী সমস্ত ইভেন্টগুলি গ্রাস করে
    • প্রতিটি শিশু দেখার জন্য (বিপরীত ক্রমে তারা যুক্ত করা হয়েছিল)
      • স্পর্শটি যদি প্রাসঙ্গিক হয় (অভ্যন্তরীণ দেখুন), child.dispatchTouchEvent()
      • যদি এটি কোনও পূর্ববর্তী দ্বারা পরিচালিত না হয় তবে পরবর্তী দৃশ্যে প্রেরণ করুন
    • যদি কোনও শিশু ইভেন্টটি পরিচালনা না করে তবে শ্রোতারা একটি সুযোগ পান
      • OnTouchListener.onTouch()
    • যদি শ্রোতা না থাকে বা এটি পরিচালনা না করে
      • onTouchEvent()
  • বাধা দেওয়া ইভেন্টগুলি শিশু পদক্ষেপের উপরে উঠে পড়ে

তিনি github.com/devunwired/ এ কাস্টম স্পর্শের উদাহরণ কোড সরবরাহ করেন

উত্তর: চলমান অঙ্গভঙ্গিতে কোনও আগ্রহী কিনা তা নির্ধারণ করতে মূলত dispatchTouchEvent()প্রতিটি Viewস্তরে আহ্বান জানানো হয় View। একটি তার মধ্যে স্পর্শ ঘটনা চুরি করার ক্ষমতা আছে , -method আগেই কল করবে শিশুদের উপর। শুধুমাত্র যদি ডিসপ্যাচিং বন্ধ করে দেয় -method আয় সত্য। পার্থক্য যে ডিসপ্যাচিং হয় এবং বলে যদি এটা রূখা উচিত (না ডিসপ্যাচিং শিশুদের) বা না (শিশুদের ডিসপ্যাচিং)ViewGroupViewGroupdispatchTouchEvent()dispatchTouchEvent()ViewGroupViewGroup onInterceptTouchEvent()dispatchTouchEvent()MotionEventsonInterceptTouchEventMotionEvent

আপনি ভিউগ্রুপের কোডটি কম-বেশি করে (খুব সরলীকৃত) এর কাজটি করতে পারবেন:

public boolean dispatchTouchEvent(MotionEvent ev) {
    if(!onInterceptTouchEvent()){
        for(View child : children){
            if(child.dispatchTouchEvent(ev))
                return true;
        }
    }
    return super.dispatchTouchEvent(ev);
}

64

পরিপূরক উত্তর

অন্যান্য উত্তরের জন্য এখানে কিছু ভিজ্যুয়াল পরিপূরক রয়েছে। আমার পুরো উত্তর এখানে

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

dispatchTouchEvent()একটি পদ্ধতি ViewGroupব্যবহার onInterceptTouchEvent()পছন্দ করে নিন কিনা তা অবিলম্বে (সংস্পর্শে ঘটনা হ্যান্ডেল করা হয় onTouchEvent()) অথবা জ্ঞাপক অবিরত dispatchTouchEvent()তার সন্তানদের পদ্ধতি।


#IntercepTouchEvent কেও ক্রিয়াকলাপে বলা যেতে পারে ?? আমি মনে করি এটি কেবলমাত্র একটি ভিউ গ্রুপে সম্ভব বা আমি ভুল? @ সুরগাচ
ফেদেরিকো রিজো

@ ফেডেরিকো রিজ্জো, আপনি ঠিক বলেছেন! আপনাকে অনেক ধন্যবাদ! আমি চিত্র এবং আমার উত্তর আপডেট করেছি।
সুরগাচ

20

এই পদ্ধতিগুলি সম্পর্কে প্রচুর বিভ্রান্তি রয়েছে, তবে এটি আসলে এত জটিল নয়। বিভ্রান্তির বেশিরভাগ কারণ হ'ল:

  1. আপনার যদি View/ViewGroupবা তার শিশুদের কোন সত্য ফিরে আসতে না onTouchEvent, dispatchTouchEventএবং onInterceptTouchEventকেবলমাত্র জন্য ডাকা হবে MotionEvent.ACTION_DOWN। এর থেকে সত্য না onTouchEventহলে পিতামাতার ভিউ ধরে নিবে আপনার ভিউ মোশনএভেন্টসের প্রয়োজন নেই।
  2. ভিউগ্রুপের বাচ্চাদের কেউই যখন টাচএভেন্টে সত্য না ফিরে আসে, MotionEvent.ACTION_DOWNআপনার ভিউগ্রুপটি সত্যিকার অর্থে ফিরে আসে, এমনকি অনিরসেপ্টউচ এভেন্টের জন্যই ডাকা হবে onTouchEvent

প্রসেসিং অর্ডারটি এরকম:

  1. dispatchTouchEvent বলা হয়.
  2. onInterceptTouchEventMotionEvent.ACTION_DOWNযখন ভিউগ্রুপের কোনও শিশু সত্যই ফিরে আসে তখন বা তার জন্য ডাকা হয় onTouchEvent
  3. onTouchEventভিউগ্রুপের বাচ্চাদের প্রথমে আহ্বান জানানো হয় এবং যখন বাচ্চাদের কেউ সত্য না ফেরায় তখন ডাকা হয় View/ViewGroup

আপনি যদি TouchEvents/MotionEventsআপনার বাচ্চাদের ইভেন্টগুলি অক্ষম না করে প্রাকদর্শন করতে চান তবে আপনার অবশ্যই দুটি জিনিস করতে হবে:

  1. dispatchTouchEventইভেন্টটির পূর্বরূপ দেখতে ও ফিরে আসার জন্য ওভাররাইড করুন super.dispatchTouchEvent(ev);
  2. ওভাররাইড করে onTouchEventসত্যে ফিরে আসুন, অন্যথায় আপনি MotionEvent ব্যতীত আর কিছু পাবেন না MotionEvent.ACTION_DOWN

আপনি যদি ইশারাটি সনাক্ত না করেন ততক্ষণ আপনি যদি বাচ্চাদের উপর অন্যান্য ইভেন্টগুলি অক্ষম না করে কোনও সোয়াইপ ইভেন্টের মতো কিছু অঙ্গভঙ্গি সনাক্ত করতে চান তবে আপনি এটি এটি করতে পারেন:

  1. উপরে বর্ণিত মোশনইভেন্টসটির পূর্বরূপ দেখুন এবং যখন আপনি আপনার অঙ্গভঙ্গিটি শনাক্ত করেন তখন একটি পতাকা সেট করুন।
  2. onInterceptTouchEventআপনার পতাকা যখন আপনার বাচ্চাদের দ্বারা মোশনএভেন্ট প্রসেসিং বাতিল করতে সেট করা হবে তখন সত্যটিতে ফিরে আসুন । আপনার পতাকাটি পুনরায় সেট করার জন্য এটিও একটি সুবিধাজনক জায়গা, কারণ অনিরসেপ্টউচ এভেন্টটিকে পরবর্তী আগ পর্যন্ত আর ডাকা হবে না MotionEvent.ACTION_DOWN

FrameLayoutএকটিতে ওভাররাইডের উদাহরণ (আমার উদাহরণটি সি # যেমন আমি জ্যামারিন অ্যান্ড্রয়েডের সাথে প্রোগ্রামিং করছি তবে জাভাতে যুক্তিটি একই রকম):

public override bool DispatchTouchEvent(MotionEvent e)
{
    // Preview the touch event to detect a swipe:
    switch (e.ActionMasked)
    {
        case MotionEventActions.Down:
            _processingSwipe = false;
            _touchStartPosition = e.RawX;
            break;
        case MotionEventActions.Move:
            if (!_processingSwipe)
            {
                float move = e.RawX - _touchStartPosition;
                if (move >= _swipeSize)
                {
                    _processingSwipe = true;
                    _cancelChildren = true;
                    ProcessSwipe();
                }
            }
            break;
    }
    return base.DispatchTouchEvent(e);
}

public override bool OnTouchEvent(MotionEvent e)
{
    // To make sure to receive touch events, tell parent we are handling them:
    return true;
}

public override bool OnInterceptTouchEvent(MotionEvent e)
{
    // Cancel all children when processing a swipe:
    if (_cancelChildren)
    {
        // Reset cancel flag here, as OnInterceptTouchEvent won't be called until the next MotionEventActions.Down:
        _cancelChildren = false;
        return true;
    }
    return false;
}

3
আমি জানি না কেন এর আরও বেশি উদ্যোগ নেই। এটি একটি ভাল উত্তর (আইএমও) এবং আমি এটি খুব সহায়ক বলে মনে করি।
মার্ক ওর্মেশার

8

আমি এই ওয়েবপৃষ্ঠায় খুব স্বজ্ঞাত ব্যাখ্যা পেয়েছি http://doandroids.com/blogs/tag/codeexample/ । সেখান থেকে নেওয়া:

  • বুলিয়ান অন টাচইভেন্ট (মোশনইভেন্ট ইভ) - যখনই লক্ষ্য হিসাবে চিহ্নিত এই দৃশ্যের সাথে একটি স্পর্শ ইভেন্ট সনাক্ত করা হয়
  • বুলিয়ান অনইন্টারসেপ্টটিউচ এভেন্ট (মোশনইভেন্ট ইভ) - যখনই এই ভিউগ্রুপ বা এটির কোনও শিশুকে লক্ষ্য হিসাবে কোনও স্পর্শ ইভেন্ট সনাক্ত করা হয়। যদি এই ফাংশনটি সত্য ফিরে আসে, মোশনইভেন্টকে বাধা দেওয়া হবে, যার অর্থ এটি সন্তানের কাছে দেওয়া হবে না, বরং এই দৃশ্যের অনুলিপ এভেন্টে দেওয়া হবে।

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

8

অনির্সেপ্টটাইচ এভেন্টের আগে ডিসপ্যাচটচ এভেন্ট হ্যান্ডেল করে।

এই সহজ উদাহরণ ব্যবহার করে:

   main = new LinearLayout(this){
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            System.out.println("Event - onInterceptTouchEvent");
            return super.onInterceptTouchEvent(ev);
            //return false; //event get propagated
        }
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            System.out.println("Event - dispatchTouchEvent");
            return super.dispatchTouchEvent(ev);
            //return false; //event DONT get propagated
        }
    };

    main.setBackgroundColor(Color.GRAY);
    main.setLayoutParams(new LinearLayout.LayoutParams(320,480));    


    viewA = new EditText(this);
    viewA.setBackgroundColor(Color.YELLOW);
    viewA.setTextColor(Color.BLACK);
    viewA.setTextSize(16);
    viewA.setLayoutParams(new LinearLayout.LayoutParams(320,80));
    main.addView(viewA);

    setContentView(main);

আপনি দেখতে পাচ্ছেন যে লগটি এমন হবে:

I/System.out(25900): Event - dispatchTouchEvent
I/System.out(25900): Event - onInterceptTouchEvent

সুতরাং আপনি যদি এই 2 টি হ্যান্ডলারের সাথে কাজ করছেন তবে প্রথম ইভেন্টটি হ্যান্ডেল করতে ডিসপ্যাচটচ এভেন্ট ব্যবহার করুন, যা অন্টরসেপ্টটাইচ এভেন্টে যাবে।

আর একটি পার্থক্য হ'ল যদি প্রেরণ-টাচ ইভেন্টটি 'মিথ্যা' ঘটনাটি শিশুটির কাছে প্রচার না করে তবে এই ক্ষেত্রে এডিট টেক্সট, অন্যদিকে যদি আপনি অনির্সেপ্ট টুচ ইভেন্টে মিথ্যা ফিরিয়ে দেন তবে ইভেন্টটি এখনও সম্পাদনা পাঠ্য পাঠায়


5

সংক্ষিপ্ত উত্তর: সবার আগেdispatchTouchEvent() বলা হবে।

সংক্ষিপ্ত পরামর্শ:dispatchTouchEvent() যেহেতু এটি নিয়ন্ত্রণ করা শক্ত হয় সেহেতু ওভাররাইড করা উচিত নয় , কখনও কখনও এটি আপনার কার্য সম্পাদনকে ধীর করতে পারে। আইএমএইচও, আমি ওভাররাইড করার পরামর্শ দিচ্ছি onInterceptTouchEvent()


বেশিরভাগ উত্তর ক্রিয়াকলাপ / ভিউ গ্রুপ / ভিউতে প্রবাহ স্পর্শ ইভেন্ট সম্পর্কে খুব স্পষ্টভাবে উল্লেখ করেছে বলে আমি এই পদ্ধতিগুলিতে কোড সম্পর্কে আরও বিশদ যুক্ত করছি ViewGroup(উপেক্ষা করে dispatchTouchEvent()):

onInterceptTouchEvent()প্রথমে ডাকা হবে, এ্যাকশন ইভেন্টটি যথাক্রমে নীচে -> সরানো -> উপরে ডাকা হবে। এখানে দুটি মামলা রয়েছে:

  1. আপনি যদি 3 টি ক্ষেত্রে (ACTION_DOWN, ACTION_MOVE, ACTION_UP) মিথ্যা ফেরত দেন তবে এটি পিতামাতার এই স্পর্শ ইভেন্টটির প্রয়োজন হবে না বলে বিবেচনা করা হবে , তাই onTouch()পিতামাতারা কখনও ফোন করেন না , onTouch()পরিবর্তে বাচ্চাদের ডাকবে ; তবে দয়া করে লক্ষ্য করুন:

    • onInterceptTouchEvent()এখনও স্পর্শ ইভেন্টের গ্রহণ করতে যতদিন তার সন্তানদের ডাকে না অবিরত requestDisallowInterceptTouchEvent(true)
    • যদি সেই ইভেন্টটি প্রাপ্ত কোনও শিশু না থাকে (এটি 2 টি ক্ষেত্রে ঘটতে পারে: ব্যবহারকারীরা যে অবস্থানে স্পর্শ করেন না বা কোনও শিশু রয়েছে তবে এটি অ্যাকশন_ডাউনটিতে মিথ্যা প্রত্যাবর্তন করে), বাবা-মা সেই ইভেন্টটি তাদের পিতামাতার কাছে ফেরত পাঠিয়ে দেবেন onTouch()
  2. বিপরীতে, যদি আপনি সত্য ফিরে পান , পিতামাতাই এই স্পর্শ ইভেন্টটি অবিলম্বে চুরি করবেন , এবং onInterceptTouchEvent()তাত্ক্ষণিকভাবে থামবে, onTouch()পিতামাতার পরিবর্তে ডাকা হবে পাশাপাশি সমস্ত onTouch()বাচ্চারা শেষ ক্রিয়াকলাপটি গ্রহণ করবে - অ্যাকশন_সেন্সেল (এইভাবে, এর অর্থ পিতামাতারা স্পর্শ ইভেন্ট চুরি করেছে, এবং শিশুরা তখন থেকে এটি পরিচালনা করতে পারে না)। onInterceptTouchEvent()মিথ্যা রিটার্ন প্রবাহ স্বাভাবিক, তবে রিটার্ন ট্রু কেস নিয়ে কিছুটা বিভ্রান্তি রয়েছে, তাই আমি এখানে এটি তালিকাবদ্ধ করছি:

    • সত্যিকারের ACTION_DOWN এ ফিরে আসুন, onTouch()পিতামাতার মধ্যে আবার ACTION_DOWN এবং নিম্নলিখিত ক্রিয়াগুলি (ACTION_MOVE, ACTION_UP) পাবেন।
    • সত্যিকারের ACTION_MOVE এ ফিরে আসুন, onTouch()পিতামাতার মধ্যে পরবর্তী ACTION_MOVE (একই ACTION_MOVE তে নয় onInterceptTouchEvent()) এবং নিম্নলিখিত ক্রিয়াগুলি (ACTION_MOVE, ACTION_UP) পাবেন।
    • ACTION_UP এ সত্য প্রত্যাবর্তন করুন , পিতামাতার স্পর্শ ইভেন্ট চুরি করতে খুব দেরি onTouch()হওয়ায় পিতামাতাদের কোনও কল করা হবে না

আরও একটি গুরুত্বপূর্ণ বিষয় হ'ল ইভেন্টটির অ্যাকশন_ডাউনটি onTouch()নির্ধারণ করবে যে ভিউটি event ইভেন্ট থেকে আরও ক্রিয়া গ্রহণ করতে চায় কিনা। যদি ভিউটি ACTION_DOWN এ সত্য ফিরে আসে onTouch()তবে এর অর্থ ভিউটি সেই ইভেন্ট থেকে আরও ক্রিয়া গ্রহণ করতে ইচ্ছুক। অন্যথায়, ACTION_DOWN এ মিথ্যা প্রত্যাবর্তনের মাধ্যমে onTouch()বোঝানো হবে যে ভিউটি ইভেন্টটি থেকে আর কোনও পদক্ষেপ গ্রহণ করবে না।


4

আপনি এই ভিডিওটি https://www.youtube.com/watch?v=SYoN-OvdZ3M&list=PLonJJ3BVjZW6CtAMbJz1XD8ELUs1KXaTD&index=19 এবং পরবর্তী 3 টি ভিডিওতে উত্তরটি পেতে পারেন । সমস্ত স্পর্শ ইভেন্টগুলি খুব ভালভাবে ব্যাখ্যা করা হয়েছে, এটি খুব পরিষ্কার এবং উদাহরণে পূর্ণ।


এগুলি সত্যিই ভাল ভিডিও, আমি কয়েকটি দেখেছি এবং এটি আমার সমস্যার সমাধান করেছে।
সাইমন

3

ভিউগ্রুপ সাবক্লাসের মধ্যে নিম্নলিখিত কোডটি এর পিতামাত্রে ধারকদের স্পর্শ ইভেন্টগুলি গ্রহণ থেকে বিরত করবে:

  @Override
  public boolean dispatchTouchEvent(MotionEvent ev) {
    // Normal event dispatch to this container's children, ignore the return value
    super.dispatchTouchEvent(ev);

    // Always consume the event so it is not dispatched further up the chain
    return true;
  }

ব্যাকগ্রাউন্ড ভিউগুলিকে স্পর্শ ইভেন্টের প্রতিক্রিয়া থেকে রোধ করতে আমি এটি একটি কাস্টম ওভারলে দিয়ে ব্যবহার করেছি।


1

প্রধান পার্থক্যটি :

Tivity Activity.dispatchTouchEvent (মোশনইভেন্ট) - এটি আপনার ক্রিয়াকলাপটি সমস্ত স্পর্শ ইভেন্টগুলিকে উইন্ডোতে প্রেরণের আগে তাদের বাধা দিতে দেয়।
• ViewGroup.onIntercepTouchEvent (মোশনইভেন্ট) - এটি একটি ভিউ গ্রুপকে শিশু দর্শনে প্রেরণ করার সাথে সাথে ইভেন্টগুলি দেখার অনুমতি দেয়।


1
হ্যাঁ, আমি এই উত্তরগুলি অ্যান্ড্রয়েড ডেভ গাইড থেকে জানি never তবুও অস্পষ্ট। পদ্ধতিটি ডিসপ্যাচ টাচ এভেন্টটি কেবলমাত্র একটি কার্যকলাপের জন্য নয় ভিউগ্রুপের জন্যও বিদ্যমান। আমার প্রশ্নটি ছিল, ভিউগ্রুপের হায়ারার্কির মধ্যে যেমন রিলেটিভলআউটস, তিনটি পদ্ধতি কীভাবে প্রেরণ করুন টাচএভেন্ট, অনন্টারসেপ্ট টাচ ইভেন্ট এবং অন টাচএভেন্ট একসাথে যোগাযোগ করে।
অ্যান ড্রয়েড

1

ভিউগ্রুপগুলি onInterceptTouchEvent()সর্বদা ACTION_DOWNইভেন্টের জন্য প্রবেশের পয়েন্ট হয় যা ঘটে যাওয়া প্রথম ইভেন্ট।

আপনি যদি ভিউগ্রুপটি এই অঙ্গভঙ্গিটি প্রক্রিয়া করতে চান তবে এখান থেকে আসুন onInterceptTouchEvent()। সত্য প্রত্যাবর্তন করার পরে, ভিউগ্রুপগুলি onTouchEvent()পরবর্তী ACTION_UPবা পরবর্তী সমস্ত ঘটনাগুলি গ্রহণ করবে ACTION_CANCELএবং বেশিরভাগ ক্ষেত্রে, ACTION_DOWNএবং ACTION_UPবা ACTION_CANCELএর মধ্যে থাকা স্পর্শ ইভেন্টগুলি ACTION_MOVEসাধারণত স্ক্রোলিং / ফ্লাইং অঙ্গভঙ্গি হিসাবে স্বীকৃত হবে।

আপনি যদি থেকে মিথ্যা প্রত্যাবর্তন করেন onInterceptTouchEvent()তবে লক্ষ্য দর্শনের কল করা onTouchEvent()হবে। এটি পরবর্তী বার্তাগুলির জন্য পুনরাবৃত্তি হবে যতক্ষণ না আপনি সত্য থেকে ফিরে আসেন onInterceptTouchEvent()

উত্স: http://neevek.net/posts/2013/10/13/implementing-onIntercepTouchEvent-and-onTouchEvent-for-ViewGroup.html


0

অ্যাক্টিভিটি এবং ভিউ উভয়েরই পদ্ধতিতে ডিসপ্যাচ টাচ ইভেন্ট () এবং অনটিউচএভেন্ট রয়েছে View ভিউগ্রুপটিতে এই পদ্ধতিগুলিও রয়েছে তবে অন্টরেসেপ্ট টাচ ইভেন্ট নামে একটি অন্য পদ্ধতি রয়েছে। এই পদ্ধতিগুলির রিটার্নের ধরণটি বুলিয়ান, আপনি ফেরতের মানের মাধ্যমে প্রেরণের রুটটি নিয়ন্ত্রণ করতে পারেন।

অ্যান্ড্রয়েডে ইভেন্ট প্রেরণটি ক্রিয়াকলাপ থেকে শুরু হয় -> ভিউগ্রুপ-> দেখুন।


0
public boolean dispatchTouchEvent(MotionEvent ev){
    boolean consume =false;
    if(onInterceptTouchEvent(ev){
        consume = onTouchEvent(ev);
    }else{
        consume = child.dispatchTouchEvent(ev);
    }
}

1
আপনি কিছু ব্যাখ্যা যোগ করতে পারেন?
পল ফ্লয়েড

3
যদিও এই কোড স্নিপেট একটি ব্যাখ্যা সহ প্রশ্নটি সমাধান করতে পারে, সত্যিই আপনার পোস্টের মান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না।
রোজারিও পেরেইরা ফার্নান্দেস

-2

ছোট উত্তর:

onIntercepTouchEvent setOnTouchListener এর আগে আসে।

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