मैं नहीं पूछ रहा हूं कि स्पर्श घटनाओं को कैसे संभाला जाए, लेकिन दृश्यों के पीछे क्या चल रहा है? यदि कई नेस्टेड विजेट हैं, तो वे किस क्रम में ईवेंट देखते हैं? क्या डेवलपर पर इसका कोई नियंत्रण है? आदर्श रूप में मैं इस विषय पर एक दस्तावेज़ चाहता हूं।एंड्रॉइड टच इवेंट कैसे वितरित किए जाते हैं?
उत्तर
:
टच घटनाओं Activity.dispatchTouchEvent करने के लिए पहले दिया जाता है। यह वह जगह है जहां आप उन्हें पहले पकड़ सकते हैं।
यहां वे खिड़की पर भेज दिए जाते हैं, जहां वे दृश्य पदानुक्रम को पार करते हैं, इस तरह के क्रम में कि आखिरी बार खींचे गए विजेट (अन्य विगेट्स के शीर्ष पर) को पहले View.onTouchEvent में स्पर्श करने की संभावना है। अगर कुछ दृश्य टचवेन्ट में सत्य लौटाते हैं, तो ट्रैवर्सल स्टॉप और अन्य दृश्य स्पर्श ईवेंट प्राप्त नहीं करते हैं।
अंत में, यदि कोई दृश्य स्पर्श नहीं करता है, तो यह गतिविधि.ऑन टचवेन्ट को दिया जाता है।
यह आपका पूरा नियंत्रण है। और यह तर्कसंगत है कि जो कुछ आप किसी और चीज के शीर्ष पर खींचे जाते हैं, उसके पास नीचे खींची गई चीज़ से पहले टच इवेंट को संसाधित करने का मौका होता है।
चलिए एक दृश्य उदाहरण देखें।
जब एक स्पर्श घटना होती है, पहले हर किसी को घटना के बारे में सूचित किया जाता है, गतिविधि से शुरू होकर शीर्ष पर देखने के लिए सभी तरह से जा रहा है। फिर सभी को घटना को संभालने का मौका दिया जाता है, शीर्ष पर देखने के साथ शुरू होता है और गतिविधि पर वापस जाता है। तो गतिविधि इसे सुनने वाला पहला व्यक्ति है और अंतिम इसे संभालने का मौका दिया जाता है।
गतिविधि या कुछ ViewGroup अभी स्पर्श घटना को संभालने के लिए चाहता है तो यह सिर्फ true
लौट सकते हैं अपनी onInterceptTouchEvent()
में (और न लाइन यह करने के अवसर के नीचे किसी और को दे)।
यदि कोई दृश्य (या व्यू ग्रुप) में OnTouchListener
है, तो स्पर्श ईवेंट OnTouchListener.onTouch()
द्वारा प्रबंधित किया जाता है। अन्यथा इसे onTouchEvent()
द्वारा संभाला जाता है। यदि onTouchEvent()
किसी भी टच ईवेंट के लिए true
लौटाता है, तो हैंडलिंग वहां रुक जाती है। लाइन के नीचे कोई भी इस पर एक मौका नहीं मिलता है।
अधिक विस्तृत विवरण
ऊपर चित्र बातें थोड़ा और अधिक सरल वास्तविक की तुलना में आसान बनाता है। उदाहरण के लिए, गतिविधि और दृश्य समूह ए (रूट लेआउट) के बीच विंडो और सजावट दृश्य भी है। मैंने उन्हें ऊपर छोड़ दिया क्योंकि हमें आम तौर पर उनके साथ बातचीत करने की ज़रूरत नहीं है। हालांकि, मैं उन्हें नीचे शामिल करूँगा। नीचे दिया गया विवरण स्रोत कोड के माध्यम से एक स्पर्श घटना का पालन करता है। आप वास्तविक स्रोत कोड देखने के लिए एक लिंक पर क्लिक कर सकते हैं।
- गतिविधि की
dispatchTouchEvent()
एक स्पर्श घटना के बारे में अधिसूचित है। टच इवेंटMotionEvent
के रूप में पारित किया गया है, जिसमें एक्स, वाई निर्देशांक, समय, घटना का प्रकार, और अन्य जानकारी शामिल है। - स्पर्श ईवेंट विंडो के
superDispatchTouchEvent()
पर भेजा जाता है।Window
एक अमूर्त वर्ग है। वास्तविक कार्यान्वयनPhoneWindow
है। - अधिसूचना प्राप्त करने के लिए अगली पंक्ति में सजावट दृश्य
superDispatchTouchEvent()
है।DecorView
स्टेटस बार, नेविगेशन बार, सामग्री क्षेत्र इत्यादि को नियंत्रित करता है It is actually just aFrameLayout
subclass, जो स्वयंViewGroup
का सबक्लास है। - अधिसूचना प्राप्त करने वाला अगला व्यक्ति (यदि मैं गलत हूं तो मुझे सही करें) आपकी गतिविधि का सामग्री दृश्य है। जब आप एंड्रॉइड स्टूडियो के लेआउट एडिटर में लेआउट बनाते हैं तो आप एक्सएमएल में अपनी गतिविधि के मूल लेआउट के रूप में सेट करते हैं। तो क्या आप
RelativeLayout
,LinearLayout
, याConstraintLayout
चुनते हैं, वेViewGroup
के सभी उप-वर्ग हैं। और व्यू ग्रुप कोdispatchTouchEvent()
में टच इवेंट की अधिसूचना मिलती है। यह उपरोक्त मेरे आरेखों में व्यू ग्रुप ए है। ViewGroup
notify any children मेंViewGroup
बच्चों सहित टच ईवेंट का होगा। उपरोक्त मेरे आरेखों में यह व्यू ग्रुप बी है।- रास्ते में कहीं भी,
ViewGroup
short-circuitonInterceptTouchEvent()
के लिएtrue
लौटाकर अधिसूचना प्रक्रिया कर सकता है। - मानते हैं कि
ViewGroup
अधिसूचनाओं को कम करता है, अधिसूचनाओं के लिए रेखा का प्राकृतिक अंत तब होता है जब दृश्य काdispatchTouchEvent()
मिलता है। - अब समय है, घटनाओं को संभालने शुरू करने के लिए। If there is an
OnTouchListener
, तो यहonTouch()
के साथ टच इवेंट को संभालने का पहला मौका मिलता है। Otherwise, दृश्यonTouchEvent()
इसे संभालने के लिए मिलता है। - अब सभी व्यू ग्रुप लाइन को बार-बार स्पर्श करते हैं, जिस तरह से
View
ने स्पर्श ईवेंट को संभालने का मौका दिया। हालांकि, मैंने उपरोक्त आरेख में यह इंगित नहीं किया है,ViewGroup
View
सबक्लास है, इसलिए मैंने जो कुछ भी वर्णन किया है, उसके बारे मेंOnTouchListener.onTouch()
औरonTouchEvent()
भी ViewGroups पर लागू होता है। - Finally, अगर कोई और इसे नहीं चाहता है, तो गतिविधि को
onTouchEvent()
के साथ ईवेंट को संभालने का आखिरी मौका भी मिलता है।
पूछे जाने वाले प्रश्न
जब मैं कभी dispatchTouchEvent()
ओवरराइड करने के लिए की आवश्यकता होगी?
शायद आपको तब तक कुछ अतिरिक्त रूटिंग करने की आवश्यकता नहीं है जब तक कि डिफ़ॉल्ट रूप से ऐसा न हो। स्पर्श ईवेंट अधिसूचनाओं की निगरानी करने के लिए, आप इसके बजाय onInterceptTouchEvent()
ओवरराइड कर सकते हैं।
मुझे कभी भी onInterceptTouchEvent()
ओवरराइड करने की आवश्यकता कब होगी?
यदि आप बस आने वाली स्पर्श अधिसूचनाओं का जासूसी करना चाहते हैं, तो आप इसे यहां कर सकते हैं और false
वापस कर सकते हैं।
हालांकि, इस विधि को ओवरराइड करने का मुख्य उद्देश्य दृश्य समूह को किसी अन्य प्रकार के स्पर्श ईवेंट को संभालने देना है जबकि बच्चे को किसी अन्य प्रकार को संभालने देना है। उदाहरण के लिए, ScrollView
स्क्रॉलिंग को संभालने के लिए यह करता है जबकि अपने बच्चे को बटन क्लिक की तरह कुछ संभालने देता है। इसके विपरीत, यदि बच्चा दृश्य अपने माता-पिता को अपनी स्पर्श घटना चुरा नहीं देना चाहता, तो यह requestDisallowTouchIntercept()
पर कॉल कर सकता है।
टच इवेंट प्रकार क्या हैं?
वाले मुख्य
ACTION_DOWN
कर रहे हैं - यह एक स्पर्श घटना की शुरुआत है। यदि आप टच इवेंट को संभालना चाहते हैं तोonTouchEvent
मेंACTION_DOWN
ईवेंट के लिए आपको हमेशाtrue
वापस करना चाहिए। अन्यथा, आपको कोई और घटनाएं नहीं मिलेंगी।ACTION_MOVE
- जब आप अपनी उंगली को स्क्रीन पर ले जाते हैं तो यह घटना लगातार निकाल दी जाती है।ACTION_UP
- यह एक स्पर्श कार्यक्रम की आखिरी घटना है।
एक धावक ACTION_CANCEL
है। यह कहा जाता है कि पेड़ पर एक व्यू ग्रुप टच इवेंट को रोकने का फैसला करता है।
आप अन्य प्रकार के मोशनवेन्ट्स here देख सकते हैं। चूंकि एंड्रॉइड मल्टी-टच है, इसलिए अन्य उंगलियों ("पॉइंटर्स") स्क्रीन को स्पर्श करते समय ईवेंट भी निकाल दिए जाते हैं।
आगे के अध्ययन के
- एंड्रॉयड onTouchEvent Part 1, Part 2, और Part 3 (यूट्यूब वीडियो - नीचे दिए गए लिंक में से कुछ का अच्छा सारांश) (गूगल डेवलपर द्वारा पूरी तरह से वीडियो)
- Mastering the Android Touch System
- Android UI Internal : Pipeline of View's Touch Event Handling
- Managing Touch Events in a ViewGroup (एंड्रॉइड दस्तावेज़)
- Input Events (एंड्रॉइड डी OCS)
- Gestures and Touch Events
- 1. एंड्रॉइड: टच इवेंट
- 2. एंड्रॉइड लांग-टच इवेंट
- 3. मल्टीकोर + हाइपरथ्रेडिंग - धागे कैसे वितरित किए जाते हैं?
- 4. पर्ल के साथ कौन से मॉड्यूल वितरित किए जाते हैं?
- 5. एंड्रॉइड टच इवेंट निर्धारित अवधि
- 6. एंड्रॉइड वेबव्यू टच इवेंट लिंक
- 7. टच इवेंट
- 8. सी # जेनेरिक कैसे लागू किए जाते हैं?
- 9. म्यूटेक्स कैसे कार्यान्वित किए जाते हैं?
- 10. डोम पार्सर्स कैसे कार्यान्वित किए जाते हैं?
- 11. कमजोर संदर्भ कैसे लागू किए जाते हैं?
- 12. सदस्य प्रकार कैसे कार्यान्वित किए जाते हैं?
- 13. लॉगरिदम प्रोग्राम कैसे किए जाते हैं?
- 14. पीडीएफ आकार कैसे निर्दिष्ट किए जाते हैं?
- 15. आईओएस गेम्स कैसे स्थापित किए जाते हैं?
- 16. जावा थ्रेड कैसे निर्धारित किए जाते हैं?
- 17. टच इवेंट: जब आइटम
- 18. CSS3 टच इवेंट
- 19. एचटीएमएल चेकबॉक्स तत्व केवल तभी सबमिट किए जाते हैं जब वे चेक किए जाते हैं?
- 20. एंड्रॉइड संसाधन: संसाधनों से लोड किए गए बिटमैप मेमोरी के अनुसार कैसे प्रबंधित किए जाते हैं?
- 21. WM_TOUCH को टच डाउन इवेंट
- 22. जावा एनोटेशन कब निष्पादित किए जाते हैं?
- 23. स्टेटलेस ईजेबी क्यों पूल किए जाते हैं?
- 24. निरंतर टच इवेंट कैसे प्राप्त करें?
- 25. कैलियर पर टच इवेंट कैसे प्राप्त करें?
- 26. एंड्रॉइड 4.0 नेविगेशन बार में हाइजैक पहला टच इवेंट
- 27. गैलरी में वेबव्यू स्क्रॉल/टच इवेंट
- 28. साझा किए गए ताले लॉक कब जारी किए जाते हैं?
- 29. व्यूपेजर में वेब व्यू लोड नहीं किए जाते/प्रस्तुत किए जाते हैं जब तक पेज
- 30. माउस व्हील डाउन इवेंट वाली वेबसाइट पर कितने पिक्सल स्क्रॉल किए जाते हैं?
आप दस्तावेज़ इस का वर्णन करने का किसी भी तरह का है? – DJClayworth
प्रेषण के बारे में: मैं स्रोत कोड और फ़ंक्शन टिप्पणियां पढ़ सकता हूं। व्यू ट्रैवर्सल के आदेश के बारे में - मैंने इसे कुछ दस्तावेज़ में पढ़ा है, निश्चित रूप से developer.android.com पर, लेकिन अब बिल्कुल नहीं बता सकता है। –
वैसे भी, अच्छी शुरुआत: http://developer.android.com/guide/topics/ui/ui-events.html –