2013-02-06 14 views
7

मैं पहले एक टैप ट्रिगर किए बिना डबल टैप का पता लगाना चाहता हूं। मैंने दो बार श्रोताओं को क्लिक करने की कोशिश की है लेकिन डबल बार पता चलने से पहले आपको हमेशा एक ऑनलिंग टापअप मिलता है, जो मुझे लगता है कि उचित है। लेकिन मेरे ऐप में, मैं वास्तव में एक क्लिक पर कॉलबैक नहीं चाहता हूं जब रास्ते पर डबल क्लिक होता है।एंड्रॉइड एकल टैप के बिना डबल टैप का पता लगाता है

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

mGD = new GestureDetector(getContext(), new SimpleOnGestureListener() { 

      @Override 
      public boolean onSingleTapUp(MotionEvent ev) { 
       //Log.d("KitView", "onSingleTapUp "+ev.toString()); 

       class DblTapTask extends AsyncTask<Void, Void, Void> { 

        @Override 
        protected void onPreExecute() { 
         Log.d("KitView", "onPreExecute"); 
        } 

        protected Void doInBackground(Void... args) { 
         Log.d("KitView", "doInBackground"); 
         try { 
          Thread.sleep(1000); 
         } catch (InterruptedException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
         return null; 
        } 

        protected void onPostExecute(Void result) { 
         Log.d("KitView", "onPostExecute"); 
              doSigleTapAction(); 
         mDblTapTask=null; 
        } 
       }; 

       if(mDblTapTask==null) { 
        Log.d("KitView", "START TASK"); 
        mDblTapTask = new DblTapTask(); 
        mDblTapTask.execute(); 
       } else { 
        Log.d("KitView", "TASK RUNNING"); 
            doDoubleTapAction(); 
       } 


       Log.d("KitView", "onSingleTapUp DONE"); 
       return true; 
      } // end onSingleTapUp 

     });  // end new GestureDetector 

इस उदाहरण में, मुझे पहले टैप पर बस सिंगलटैप पर ठीक है। मेरा टाइमआउट doInBackground में परीक्षण के लिए 1 सेकंड है इसलिए मेरे पास दूसरी टैप करने के लिए बहुत समय है। ध्यान दें कि Log.d ("KitView", "onSingleTapUp DONE"); तुरंत चलाता है मैं पहली टैप करता हूं, इसलिए SingleTapUp फांसी नहीं है।

समस्या यह है कि, 1sec के भीतर फिर से टैप करने से कुछ भी नहीं होता है। नींद खत्म होने के बाद औरपोस्टएक्सक्यूट चलने तक सिंगलटैप पर कोई कॉल नहीं है। तो Log.d ("KitView", "TASK रनिंग"); ऐसा कभी नहीं होता है जहां मैं डबल क्लिक बनाम एकल क्लिक का पता लगाऊंगा।

मुझे यकीन नहीं है कि क्यों एन्क्टास्क घटनाओं को अवरुद्ध कर रहा है, कोई विचार? धन्यवाद

+0

http://developer.android.com/reference/android/view/GestureDetector.SimpleOnGestureListener.html –

उत्तर

10

मैं जो हासिल करने की कोशिश कर रहा हूं उस पर उलझन में हूं। एकल टैप विधि होने पर डबल टैप विधि onDoubleTap() नहीं कहा जाता है। दूसरी ओर, प्रत्येक डबल टैप के लिए दो संबंधित सिंगल टैप onSingleTapUp() विधि कॉल हैं।

यदि आप उन्हें अलग करना चाहते हैं, तो आप onSingleTapConfirmed() का उपयोग कर सकते हैं जो ट्रिगर किया जाता है जब इशारा डिटेक्टर सुनिश्चित करता है कि टैप एकल है। संदर्भ देखें:

एक-टैप होने पर अधिसूचित किया गया।

OnGestureListener.onSingleTapUp(MotionEvent) के विपरीत, इस के बाद ही डिटेक्टर पूरा भरोसा है कि उपयोगकर्ता का प्रथम नल एक दूसरे नल एक डबल-टैप जेस्चर के लिए अग्रणी द्वारा पीछा नहीं कर रहा है

फिर आप में इस विधि कॉल उपयोग कर सकते हैं बुलाया जाएगा किसी भी प्रकार के सिंगल/डबल टैप को अनिवार्य रूप से पहचानने के लिए boolean ध्वज के साथ संयोजन।

+0

हां, मैंने अभी भी सिंगलटैप पर पाया है, धन्यवाद – steveh

+0

@steveh lol: डी खुश कोडिंग! – andr

5

जैसा कि नीचे का प्रयास करें:

आप GestureDetector उपयोग कर सकते हैं। निम्नलिखित कोड देखें:

public class MyView extends View { 

GestureDetector gestureDetector; 

public MyView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
      // creating new gesture detector 
    gestureDetector = new GestureDetector(context, new GestureListener()); 
} 

// skipping measure calculation and drawing 

    // delegate the event to the gesture detector 
@Override 
public boolean onTouchEvent(MotionEvent e) { 
    return gestureDetector.onTouchEvent(e); 
} 


private class GestureListener extends GestureDetector.SimpleOnGestureListener { 

    @Override 
    public boolean onDown(MotionEvent e) { 
     return true; 
    } 
    // event when double tap occurs 
    @Override 
    public boolean onDoubleTap(MotionEvent e) { 
     Log.d("Double Tap", "Tapped Occured."); 
     return true; 
    } 
} 
} 

आप एकल नल, flinges और इतने पर प्राप्त करने के लिए श्रोता के अन्य तरीकों ओवरराइड कर सकते हैं।

+0

सुनिश्चित करने का प्रयास करें, यह वही है जो मैं अब कर रहा हूं, समस्या यह है कि अगर मैं सिंगलटैप (मोशनवेन्ट ईवी) पर जोड़ता हूं तो समस्या यह है कि हमेशा डबलटैप पर पहले कहा जाएगा जो मैं नहीं चाहता हूं। – steveh

+1

"andr" के रूप में सुझाव देता है कि आपको एकल टैप के लिए SingleTapConf पुष्टि() पर आज़माएं। डबल टैप के रूप में दो एकल नल का संयोजन होता है। – AAnkit

1

मुझे लगता है कि मैं इसे समझ गए होंगे

@Override 
      public boolean  onSingleTapConfirmed(MotionEvent e) { 
       Log.d("KitView", "onSingleTapConfirmed"); 
       return true; 
      } 
      @Override 
      public boolean onDoubleTap(MotionEvent e) { 
       Log.d("KitView", "onDoubleTap"); 
       return true; 
      } 

onSingleTapConfirmed नहीं बुलाया जाता है जब मैं एक डबल नल, अच्छा और आसान

+1

मुझे लगता है कि आपने पहले मेरा समाधान नहीं देखा;) – andr

+0

धन्यवाद, मैंने इसे पहले ही स्वीकार कर लिया है – steveh

0

आप विस्फोट से उड़ा दिया का उल्लेख कर सकते हैं: onTouchEvent ओवरराइड() methed

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

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