2010-07-13 12 views
5

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

इसलिए मैंने ऑन टच इवेंट श्रोता से एक लंबे स्पर्श का पता लगाने और कार्यान्वित करने का निर्णय लिया।

यहाँ मेरी कोड है:

@Override 
    public boolean onTouch(View v, MotionEvent event) 
    { 
     long touchDuration = 0; 


      if (event.getAction() == MotionEvent.ACTION_DOWN) 
      { 
       //Start timer 
       touchTime = System.currentTimeMillis(); 


      }else if (event.getAction() == MotionEvent.ACTION_UP) 
      { 
       //stop timer 
       touchDuration = System.currentTimeMillis() - touchTime; 

       if (touchDuration < 800) 
       { 
        onShortTouch(event,touchDuration); 
       }else 
       { 
        onLongTouch(event,touchDuration); 
       } 
      } 
     } 

     return true; 

यह काम करता है, लेकिन मैं अगर प्रेस एक लंबे प्रेस था या नहीं उपयोगकर्ता फोन को छू बंद हो जाता है केवल जब पता लगा सकते हैं। तो यह वही नहीं है जो मैं चाहता हूं। अगर मैं पहली बार स्क्रीन को छूता हूं तो एक टाइमर शुरू होता है तो एक बार 800 एमएस लांग टच() विधि को समाप्त कर दिया जाता है। दूसरे शब्दों में, मैं यह जांचना नहीं चाहता कि ACTION_DUP से ACTION_UP के बाद कितना समय बीत चुका है। मेरा मानना ​​है कि मुझे कहा टाइमर के लिए धागे का उपयोग करना चाहिए, लेकिन मैं इसे काम नहीं कर सकता। निम्न कोड का उपयोग करते समय, जैसे ही मैं स्क्रीन को स्पर्श करता हूं, डीबग संदेश प्रदर्शित होता है:

 @Override 
    public boolean onTouch(View v, MotionEvent event) 
    { 
     long touchDuration = 0; 

      TouchThread touchThread = new TouchThread(); 

      if (event.getAction() == MotionEvent.ACTION_DOWN) 
      { 
       //Start timer 
       touchTime = System.currentTimeMillis(); 
       touchThread.setEvent(event); 
       touchThread.run(); 
      } 

     return true; 
    } 


    private class TouchThread extends Thread 
    { 

      public MotionEvent event = null; 

      public void setEvent(MotionEvent e) 
      { 
       event = e; 
      } 

      @Override 
      public void run() 
      { 
       long startTime = System.currentTimeMillis(); 
       long time = 0; 

       while(event.getAction() == MotionEvent.ACTION_DOWN) 
       { 
        time = System.currentTimeMillis() - startTime; 
        if(time > 800) 
        { 
         System.out.println("LOOONG CLICK!!"); 
         return; 
        } 
       } 
      } 
    } 

क्या किसी को कोई विचार है? एक अन्य समाधान का भी स्वागत किया जाएगा।

धन्यवाद। , http://developer.android.com/reference/android/view/GestureDetector.html

मैं का उपयोग कैसे करें यह निर्माता में एक GestureDetector उदाहरण बनाने के लिए है, विधियों मैं में दिलचस्पी रखता हूँ लागू:

उत्तर

3

एक अच्छा विकल्प है जब आप भी कुछ मैनुअल घटना प्रसंस्करण क्या करना चाहते हैं GestureDetector वर्ग है

if (gestureDetector.onTouchEvent(event)) { 
     return true; 
    } 

कौन सा तो ज्यादातर मामलों में इसका मतलब है जब एक इशारे का पता चला है कि अपने स्पर्श से निपटने के बाकी रोकता: और फिर विधि onTouchEvent() के शुरू में की तरह कुछ है। हालांकि, लंबी प्रेस थोड़ा अलग है क्योंकि लंबी प्रेस विधि एक मान वापस नहीं करती है। इस मामले में मेरे पास बस एक बूलियन है जो मैंने सेट किया है जब लंबी प्रेस ट्रिगर होती है कि यदि आवश्यक हो तो मैं बाद में टच इवेंट हैंडलिंग विधि में जांच करता हूं।

1

एक चीज जो आप कर सकते हैं वह है अपने SurfaceView पर OnLongClickListener सेट करें। ,

public boolean onTouchEvent(MotionEvent event) { 
    super.onTouchEvent(event); 
    return true; 
} 
3

यह काफी आसान है वास्तव में:

mySurfaceView.setOnLongClickListener(l); 

फिर अपने SurfaceView में, आप onTouchEvent ओवरराइड करने के लिए की जरूरत है। अपने दृश्य के निर्माता में, इस कार्य करें:

setOnLongClickListener(new View.OnLongClickListener() 
{ 
    public boolean onLongClick(View v) { 
     Log.v("debug", "LONG CLICK!"); 
     return true; 
    } 
    } 
); 

फिर onTouchEvent ओवरराइड:

@Override 
    public boolean onTouchEvent(MotionEvent event) { 
     super.onTouchEvent(event); 
    } 

और आप तैयार हैं;)।

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