2012-12-04 10 views
8

मेरे पास टच इवेंट्स के मास्किंग के साथ कुछ छोटे प्रश्न हैं। मैंने यहां और कहीं और कई चीजें पढ़ी हैं लेकिन अभी भी कुछ हिस्सों में उलझन में हूं।एंड्रॉइड मल्टीटाउच और getActionMasked()

1) event.getActionMasked()event.getAction() & MotionEvent.ACTION_MASK के रूप में ही है (वे

2) दो ऊपर बताए गए आदेशों सभी जानकारी और कि अधिक से अधिक event.getAction() अकेला होगा देंगे सैमसंग एस 2 और एचटीसी डिजायर) पर दिखाई देते हैं, या यह अलग है ।

3) मैंने कोड का एक टुकड़ा लिखा है जो सरल कहता है कि कहां स्पर्श किया जा रहा है और किस पॉइंटर आईडी के साथ, या यदि सूचक उपयोग में नहीं है (केवल इस समय दो स्पर्शों के लिए लिखा गया है)। ऐसा लगता है कि ऊपर वर्णित उपकरणों पर सही ढंग से काम करना प्रतीत होता है, हालांकि मुझे पता है कि कुछ डिवाइस बिल्कुल सही तरीके से कैसे कार्य कर सकते हैं यदि बिल्कुल सही नहीं किया जाता है। इसलिए मैं सोच रहा हूं कि निम्नलिखित सही है और सभी उपकरणों पर व्यवहार करेगा।

boolean pointer0down=false, pointer1down=false; 
String st="", str0 ="", str1 =""; 

public boolean onTouchEvent(MotionEvent event) 
{ 

    if (event.getActionMasked()==MotionEvent.ACTION_UP 
     ||event.getActionMasked()==MotionEvent.ACTION_POINTER_UP 
     ||event.getActionMasked()==MotionEvent.ACTION_CANCEL) 
    { 
    if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==0) 
     pointer0down=false; 
    if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==1) 
     pointer1down=false; 
    } 

    if (event.getActionMasked()==MotionEvent.ACTION_DOWN 
    ||event.getActionMasked()==MotionEvent.ACTION_POINTER_DOWN) 
    { 
    if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==0) 
     pointer0down=true; 
    if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==1) 
     pointer1down=true; 
    } 

if (pointer0down) 
    str0="\tx: " + event.getX(0) + "\ty: "+event.getY(0); 
else 
    str0="\tNot down"; 

if (pointer1down) 
    str1="\tx: " + event.getX(1) + "\ty: "+event.getY(1); 
else 
    str1="\tNot down"; 

st="pointer0:"+str0+"\npointer1:"+str1; 

    return true; 
} 

उत्तर

16

कुछ पृष्ठभूमि -

पूर्णांक getAction से लौटे एक पैक पूर्णांक है कि दोनों कार्रवाई कोड encodes (उदाहरण, ACTION_DOWN) और सूचक सूचकांक (उदाहरण, जो उंगली) है।

एकल स्पर्श के लिए, चूंकि केवल एक उंगली शामिल है, इसलिए पॉइंटर इंडेक्स को स्टोर करने की कोई आवश्यकता नहीं है, इसलिए मूल्य केवल एक्शन कोड है। इसलिए getAction() == ACTION_DOWN

मल्टी टच के लिए, यह तुलना गलत है बी/सी आपके पास पैक किए गए पूर्णांक में अतिरिक्त सूचक सूचकांक है। आप अपने प्रश्न का getAction() & ACTION_POINTER_INDEX_MASK

कर अब से getAction() & ACTION_MASK करके कार्रवाई कोड निकाल सकते हैं और निकालने के सूचक सूचकांक -

1: हाँ। के बारे में सोचें ActionMasked एक सहायक विधि के रूप में जो क्रिया कोड बिट्स निकालें। पॉइंटर इंडेक्स निकालने के लिए आपके समतुल्य getActionIndex सहायक विधि है। ये दोनों विधियां सिंगल या मल्टी टच के लिए काम करेंगी, इसलिए वे "सुरक्षित" हैं।

2: वहाँ अपने कोड में एक बग है: जैसा कि ऊपर बताया गया है, getAction भी के लिए मल्टीटच

3 सूचक सूचकांक encodes। event.getPointerId((event.getActionIndex() & MotionEvent.ACTION_MASK)) तकनीकी रूप से गलत है। इसके बजाय आपको event.getPointerId(event.getActionIndex()) करना चाहिए। आपको मिल रहा है बहुत भाग्यशाली getActionIndex पर गलत लॉजिकल और ऑपरेटर के साथ जो 2 बाइट्स हो जाता है और मास्क स्वयं 2 बाइट्स (0xff) होता है :)

+0

उत्कृष्ट स्पष्टीकरण! – George

संबंधित मुद्दे