2011-11-10 2 views
9

मैं सिस्टम ओवरले व्यू पर एकाधिक स्पर्श ईवेंट प्राप्त करने का प्रयास कर रहा हूं, लेकिन केवल MotionEvent.ACTION_OUTSIDE ईवेंट प्राप्त कर रहा हूं।एंड्रॉइड: मल्टी टच और TYPE_SYSTEM_OVERLAY

क्या सिस्टम ओवरले पर एकाधिक स्पर्श ईवेंट प्राप्त करने का कोई संभावित तरीका है?

कोई भी उदाहरण या लिंक बहुत उपयोगी होंगे।

उत्तर

24

LayoutParams सेट करते समय ओवरले व्यू बनाने के लिए आपको टाइप को TYPE_SYSTEM_OVERLAY पर सेट करने और FLAG_WATCH_OUTSIDE_TOUCH ध्वज का उपयोग करने की आवश्यकता है। यह एक समस्या प्रस्तुत करता है क्योंकि के रूप में Android दस्तावेज़ राज्यों:

आप/पूर्ण नीचे प्राप्त नहीं होगी के लिए कदम/अप इशारा, केवल पहले नीचे एक ACTION_OUTSIDE के रूप में के स्थान।

आदेश स्पर्श इवेंट आप TYPE_SYSTEM_ALERT प्रकार का उपयोग करने की जरूरत है की पूरी सरणी प्राप्त करने के लिए, लेकिन इस ओवरले स्क्रीन पर कब्जा और अन्य तत्वों के साथ बातचीत रोकने के लिए कारण बनता है। समाधान TYPE_SYSTEM_OVERLAY और TYPE_SYSTEM_ALERT दोनों का उपयोग करना है और आवश्यकतानुसार LayoutParams के प्रकार को बदलकर उनके बीच स्विच करना है। ACTION_OUTSIDE गति घटना के लिए

  1. घड़ी:

    यह द्वारा पूरा किया है।

  2. जब ऐसा होता है, तो जांच करें कि यह ओवरले के भीतर होता है या नहीं।
  3. यदि यह किया था, एक बार जब ओवरले के साथ बातचीत के पूरा हो गया है, के लिए TYPE_SYSTEM_OVERLAY
  4. दोहराएँ

को ध्यान में रखना एक बात वापस स्विच TYPE_SYSTEM_ALERT

  • को LayoutParams प्रकार स्विच है कि ACTION_OUTSIDE गति घटना हमेशा स्क्रीन पर शेष तत्वों को पारित किया जाता है। इसलिए, उदाहरण के लिए, यदि ओवरले एक बटन के शीर्ष पर है, तो उस बटन को गति ईवेंट भी प्राप्त होगा और इसे रोकने का कोई तरीका नहीं है।

    यह भी सुनिश्चित करें कि आप SYSTEM_ALERT_WINDOW को मुख्य फ़ाइल फ़ाइल में अनुमति दें।
    http://www.jawsware.mobi/code_OverlayView/(अपडेट)

    यह सब स्रोत कोड और पूरे उदाहरण परियोजना डाउनलोड करने के लिए एक लिंक शामिल हैं:

    मैं यहाँ पूर्ण समाधान पोस्ट किया है। Android 4.0 के लिए


    अपडेट - 1/3/2013


    जब LayoutParams की स्थापना के लिए एक ओवरले दृश्य बनाने के लिए न करेंTYPE_SYSTEM_OVERLAY के प्रकार निर्धारित किया है।

    इसके बजाय इसे TYPE_PHONE पर सेट करें।

    निम्नलिखित झंडे का उपयोग करें:

    FLAG_NOT_TOUCH_MODAL

    FLAG_WATCH_OUTSIDE_TOUCH

    FLAG_NOT_TOUCH_MODAL < < मैं इस एक काफी महत्वपूर्ण हो पाया। इसके बिना, ओवरले और सॉफ्ट-कुंजी (घर, मेनू, आदि) पर ध्यान दिया जाता है, प्रेस नीचे दी गई गतिविधि को पास नहीं किया जाता है।

    इसके अलावा, पिछले लिंक (ऊपर) को इस अद्यतन को दर्शाने के लिए अद्यतन किया गया है।

  • +1

    अद्यतन जॉसवेयर के लिए धन्यवाद। लेकिन आपके तर्क के साथ भी मैं ओवरले पर कई स्पर्श घटनाओं को देखने में सक्षम नहीं हूं। मेरा मतलब है कि यदि आप स्क्रीन पर पहली उंगली रखते हैं और फिर दूसरा और फिर तीसरा (पिछला उठाने के बिना), तो हमें टच इवेंट प्राप्त करने में सक्षम होना चाहिए (यानी टच() को कॉल किया जाना चाहिए)। क्या यह वैसे भी संभव है? – Ravs

    +0

    आपको 'TYPE_SYSTEM_OVERLAY' स्थिति में बहु-स्पर्श जानकारी प्राप्त नहीं होगी। एक बार जब आप 'TYPE_SYSTEM_ALERT' पर स्विच कर लें (यानी ओवरले के अंदर दबाने के बाद अपनी अंगुली उठाएं) तो आपको मल्टी-टच ईवेंट प्राप्त करना चाहिए। मैंने अपने नमूने में 'info.setText' कॉल में से प्रत्येक को '\ nPOINTERS:" + event.getPointerCount() 'जोड़ दिया है और पॉइंटर गिनती में कमी आएगी क्योंकि मैंने अपनी उंगलियों को छुआ/हटा दिया है। पहले के बाद नीचे, मैं केवल इस कदम की घटनाओं प्राप्त है, लेकिन सूचक गिनती अभी भी बदल दिया है। – jawsware

    +1

    लेकिन क्या मैं चाहता हूँ वास्तव में TYPE_SYSTEM_OVERLAY साथ बहु स्पर्श हो रही है। है संभव है कि वैसे भी? – Ravs

    9

    Android 4.x से शुरू, एंड्रॉयड टीम एंड्रॉयड टीम एक नया कार्य adjustWindowParamsLw() जिसमें यह FLAG_NOT_FOCUSABLE, FLAG_NOT_TOUCHABLE जोड़ सकते हैं और TYPE_SYSTEM_OVERLAY खिड़की के लिए FLAG_WATCH_OUTSIDE_TOUCH झंडे निकाल देंगे जोड़कर एक संभावित सुरक्षा समस्या तय।

    यह TYPE_SYSTEM_OVERLAY विंडो आईसीएस प्लेटफ़ॉर्म पर कोई स्पर्श ईवेंट नहीं प्राप्त करेगी।

    अपडेट किया गया: 2016/05/04 TYPE_TOAST Android 4.0 ~ 4.3 पर स्पर्श घटनाओं प्राप्त नहीं कर सकते। यह TYPE_SYSTEM_OVERLAY जैसा ही है। एंड्रॉइड 4.4+ पर, TYPE_TOAST को बहिष्कृत सूची से हटा दिया गया है, ताकि आप एंड्रॉइड 4.4+ डिवाइस पर टच इवेंट प्राप्त करने के लिए TYPE_TOAST का उपयोग कर सकें।

    +1

    में यह उपयोगी है! तो आप एंड्रॉइड 4.0 से पहले समान कार्यक्षमता प्राप्त करने के लिए FLAG_WATCH_OUTSIDE_TOUCH के बजाय उपयोग करने का सुझाव दे रहे हैं। क्या कोई और ध्वज है जिसे इसके बजाय कार्यान्वित किया जाना चाहिए? – Brian