2011-12-20 22 views
20

में मल्टीटाउच को अक्षम या रोकें मेरे पास एक गतिविधि पर कई दृश्य हैं जो उपयोगकर्ता उत्तराधिकार में जल्दी से स्पर्श करना चाहता है और मैं TouchListener का उपयोग करके इन स्पर्शों को कैप्चर करता हूं और MotionEvent.ACTION_DOWN को संभालने में सक्षम हूं। हालांकि, यदि उपयोगकर्ता दो हाथों का उपयोग कर रहा है, तो यह संभव है कि उपयोगकर्ता पिछली उंगली को खींचने से पहले अगला दृश्य 'स्पर्श' किया जाएगा। इस परिदृश्य में, MotionEvent.ACTION_MOVE को दूसरे दृश्य के लिए वांछित MotionEvent.ACTION_DOWN के बजाय पहले दृश्य के लिए निकाल दिया गया है।गतिविधि

क्या इस व्यवहार को रोकने या रोकने के लिए कोई तरीका है? मैंने MotionEvent.ACTION_UP के साथ एक नया कार्यक्रम प्रेषण करने की कोशिश की है और ईवेंट श्रोता को भी हटा दिया है, लेकिन न ही काम करने लगता है।

+0

http: // stackoverflow।com/question/8570982/अक्षम-या-रोक-मल्टीटाउच-इन-गतिविधि/36281321 # 36281321 –

उत्तर

4

सबसे अच्छा इस को हल करने के लिए रास्ता परिदृश्य ViewGroup का उपयोग करना है और onInterceptTouchEvent विधि को लागू करने के लिए मैन्युअल रूप से टच ईवेंट को रूट करने के लिए लागू करें।

यह मूल रूप से उत्तर यहां गया था: Android multitouch! hack anyone?

कोड इस समाधान (ऊपर सवाल का जवाब की टिप्पणी अनुभाग में पाया जाता है) को लागू करने के लिए यहाँ पाया जाता है: http://pastebin.com/hiE1aTCw

2

मैं इस समाधान कर लिया है एक कस्टम विधि का उपयोग कर - जो मैं किसी मैं इसके बारे में सुनना चाहते हैं एक बेहतर तरीका मिल जाता है तो ऐसा करने के लिए नहीं करना चाहता था धन्यवाद:

public static void setViewGroupEnebled(ViewGroup view, boolean enabled) 
{ 
    int childern = view.getChildCount(); 

    for (int i = 0; i< childern ; i++) 
    { 
     View child = view.getChildAt(i); 
     if (child instanceof ViewGroup) 
     { 
      setViewGroupEnebled((ViewGroup) child,enabled); 
     } 
     child.setEnabled(enabled); 
    } 
    view.setEnabled(enabled); 
} 
7

मैं इसे इस तरह से किया था:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    // TODO Auto-generated method stub 

    if(event.getPointerCount() > 1) { 
     System.out.println("Multitouch detected!"); 
     return true; 
    } 
    else 
     return super.onTouchEvent(event); 
} 

मुझे लगता है कि आप किसी भी दृश्य के लिए टचवेन्ट को ओवरराइड कर सकते हैं।

<style name="MyTheme" parent="@android:style/Theme.Holo.Light"> 
    <item name="android:windowEnableSplitTouch">false</item> 
    <item name="android:splitMotionEvents">false</item> 
</style> 

मैनिफ़ेस्ट::

<application 
     android:label="@string/app_name" 
     android:theme="@style/MyTheme" > 
56

सबसे आसान तरीका मैं एक संपूर्ण एप्लिकेशन पर एकल स्पर्श मजबूर करने के लिए मिल गया एक विषय का उपयोग कर इसे स्थापित करने के लिए है हम बच्चे के विचारों को सम्मिलित करते हैं। मेरे कोड में इसकी रैखिक लयआउट। इस लीनियरआउट में मैंने बाल विचार जोड़े। लेकिन जब मैंने एक साथ दो बच्चे के विचारों पर क्लिक किया, तो दोनों घटनाएं प्राप्त कर रहे थे। ब्लॉक करने के लिए मैंने उपरोक्त कोड का उपयोग किया।

+0

बस जानकारी के लिए, "एंड्रॉइड: splitMotionEvents" को एपीआई स्तर 11 और ऊपर – gjman2

+0

की आवश्यकता होती है यह एंड्रॉइड 5.0 और ऊपर – ThanosFisherman

+3

पर काम नहीं करता है एंड्रॉइड 5.0.1 में मेरे लिए। –

0
int currentapiVersion = android.os.Build.VERSION.SDK_INT; 

      if (currentapiVersion >= android.os.Build.VERSION_CODES.HONEYCOMB) { 

       horizentalLinearGridItem.setMotionEventSplittingEnabled(false); 

      } 

यहाँ horizentalLinearGridItem parentLayout दृश्य जहां है

8

अगर किसी को अभी भी सबसे अच्छा समाधान के लिए खोज, एक्सएमएल में डाल निम्नलिखित कोड:

android:splitMotionEvents = false 
+0

सबसे आसान कामकाजी समाधान –

0

मैं यह सिर्फ OnTouchEvent विधि में कुछ कोड जोड़कर मेरे लिए काम करने के लिए मिला है,

boolean action_down_required = false; 

@Override 
public boolean onTouchEvent(MotionEvent event) { 

    int action = event.getAction(); 

    if(event.getPointerCount() > 1){ 
     action_down_required = true; 
     return true; 
    } 

    if(action_down_required){ 
     action = MotionEvent.ACTION_DOWN; 
    } 

    switch (action) { 
     case MotionEvent.ACTION_DOWN: 

      // your code goes here... 

      action_down_required = false; 
      break; 

     // Other events... 
1

प्रेषण को ओवरराइड करें स्पर्श करें और सभी स्पर्शों को अवरुद्ध करें, सभी मल्टी स्पर्शों के लिए पॉइंटरकाउंट एक से अधिक है।

if(ev.getPointerCount() > 1) 
    { 
    Log.d("Multitouch detected!"); 
    ev.setAction(MotionEvent.ACTION_CANCEL); 
    } 

यह छूता है और बिना किसी कार्रवाई के बटन दबाए गए राज्य को साफ़ करता है।

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