2010-03-29 14 views
11

मेरी कक्षा व्यू को विस्तारित करती है और मुझे इसके निरंतर स्पर्श कार्यक्रमों की आवश्यकता होती है।निरंतर टच इवेंट कैसे प्राप्त करें?

अगर मैं का उपयोग करें:

public boolean onTouchEvent(MotionEvent me) { 

    if(me.getAction()==MotionEvent.ACTION_DOWN) { 
     myAction(); 
    } 
    return true; 
} 

... स्पर्श घटना एक बार कब्जा कर लिया है।

क्या होगा यदि मैं उंगली ले जाए बिना निरंतर छूता प्राप्त करने की आवश्यकता? कृपया मुझे बताएं कि मुझे धागे या टाइमर का उपयोग करने की आवश्यकता नहीं है। मेरा ऐप पहले से ही बहुत भारी है।

धन्यवाद।

उत्तर

15

उपयोग if(me.getAction() == MotionEvent.ACTION_MOVE)। स्क्रीन पर 100% पूरी तरह से एक उंगली रखना असंभव है, इसलिए जब भी उंगली चलता है, तब भी एक्शनमोव कॉल किया जाएगा, भले ही यह केवल पिक्सेल या दो हो।

तुम भी me.getAction() == MotionEvent.ACTION_UP को सुन सके - जब तक ऐसा होता है, उपयोगकर्ता अभी भी स्क्रीन पर अपनी उंगली होना आवश्यक है।

+2

सही है, मैं ACTION_DOWN पर एक ध्वज सेट और उपयोग करें कि जब तक ध्वज सेट है का हल पसंद करेंगे ACTION_UP – WarrenFaith

+0

पर झूठी करने के लिए वास्तव में धन्यवाद। – daliz

+0

मुझे यह हर जगह उल्लेखित लगता है लेकिन यह मेरे लिए मामला प्रतीत नहीं होता है। अगर मैं स्पर्श करता हूं और पकड़ता हूं और अभी भी रहता हूं, तो मुझे ACTION_MOVE ईवेंट नहीं मिलते हैं। ACTION_MOVE केवल तभी ट्रिगर प्रतीत होता है जब मैं अपनी अंगुली को एक तरफ या दूसरी तरफ झुकाता हूं। क्या यह मेरे फोन पर एक सेटिंग हो सकती है जो इसे कम संवेदनशील रखती है? – clusterflux

3

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

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    float x = event.getX(); 
    float y = event.getY(); 
    if(isTsunami){ 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      // Write your code to perform an action on down 
      break; 
     case MotionEvent.ACTION_MOVE: 
      // Write your code to perform an action on contineus touch move 
      break; 
     case MotionEvent.ACTION_UP: 
      // Write your code to perform an action on touch up 
      break; 
    } 
    } 
    return true; 
} 
1

इसे आजमाएं। यह मेरे लिए काम करता है:

public static OnTouchListener loadContainerOnTouchListener() { 
    OnTouchListener listener = new OnTouchListener(){ 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     LinearLayout layout = (LinearLayout)v; 
     for(int i =0; i< layout.getChildCount(); i++) 
     { 
      View view = layout.getChildAt(i); 
      Rect outRect = new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()); 
      if(outRect.contains((int)event.getX(), (int)event.getY())) 
      { 
       Log.d(this.getClass().getName(), String.format("Over view.id[%d]", view.getId())); 
      } 
     } 

    } 

याद रखें: श्रोता तो आपको सेट एक कंटेनर लेआउट (ग्रिड, सापेक्ष, रैखिक) होना चाहिए। फ़ोकस करने योग्य = "true" एंड्रॉयड: क्लिक करने योग्य = "true" यदि नहीं, तो बस नीचे कार्रवाई उत्पादन

LinearLayout layout = findViewById(R.id.yourlayoutid); 
layout.setOnTouchListener(HelperClass.loadContainerOnTouchListener()); 
5

आप तत्व एंड्रॉयड के लिए यह गुण सेट करना होगा।

0

मैं अंगूठे नियंत्रण के रूप में उपयोग किए जाने वाले कस्टम व्यू के साथ एक गेम बना रहा था। । । यहाँ मैं

float x = 0, y = 0; 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    x = event.getX(); 
    y = event.getY(); 

    // handle touch events with 
    switch(event.getActionMasked()) { 
     case MotionEvent.ACTION_DOWN : 
      if(cont) 
      { 
       // remove any previous callbacks 
       removeCallbacks(contin); 

       // post new runnable 
       postDelayed(contin, 10); 
      } 
      invalidate(); 
      return true; 
     case MotionEvent.ACTION_MOVE : 
      if(!cont && thumbing != null) 
      { 
       // do non-continuous operations here 
      } 
      invalidate();  
      return true; 
     case MotionEvent.ACTION_UP : 

      // set runnable condition to false 
      x = 0; 

      // remove the callbacks to the thread 
      removeCallbacks(contin); 
      invalidate(); 
      return true; 
     default : 
      return super.onTouchEvent(event); 
    } 
} 

public boolean cont = false; 

// sets input to continuous 
public void set_continuous(boolean b) { cont = b; } 


public Runnable contin = new Runnable() 
{ 

    @Override 
    public void run() { 
     if(x != 0) 
     { 
      // do continuous operations here 
      postDelayed(this, 10); 
     } 
    } 

}; 

एक त्वरित टिप्पणी हालांकि, अपने मुख्य गतिविधि है, यह दृश्य बुला रहा है में यह सुनिश्चित कर लें क्या किया है के रूप में

@Override 
protected void onPause() { 
    if(left.cont) left.removeCallbacks(left.contin); 
    if(right.cont) right.removeCallbacks(left.contin); 
    super.onPause(); 
} 

इस तरह इस प्रकार यदि आप को थामने कॉलबैक मैन्युअल onPause विधि के माध्यम से निकाल देता है और वापस स्पर्श घटनाओं को दो बार संभाला नहीं जा रहा है और दृश्य इसके धागे के ऊपर से मुक्त है।

** **

0

इन सभी जवाब पर हार्डवेयर त्वरण के साथ सैमसंग गैलेक्सी एस 3 पर परीक्षण आंशिक रूप से सही है लेकिन वे समस्या सही तरीके से हल नहीं होती है।

सबसे पहले, वहाँ हर किसी को जब घटना ACTION_MOVE है ट्रैक करने के लिए तय करते हैं कि के लिए। वैसे यह केवल तभी काम करता है जब? जब उपयोगकर्ता अपनी अंगुली को स्थानांतरित करता है, तो यदि आप एक कस्टम अंगूठे नियंत्रण को लागू करने का निर्णय लेते हैं तो ठीक है, लेकिन एक सामान्य कस्टम बटन के लिए जो मामला नहीं है।

दूसरा, ACTION_UP में ACTION_DOWN अंदर एक ध्वज का उपयोग कर और यह जाँच यह करने के लिए तर्क रास्ता लगता है, लेकिन Clusterfux के रूप में यदि आप एक while(!up_flag) तर्क आप मुसीबतों में फंस लागू पता लगाना;)

तो उचित तरीके ऐसा करने के लिए इसे यहाँ बताया गया है:

Continuous "Action_DOWN" in Android

बस यह है कि अगर तर्क आप निरंतर प्रेस दौरान लिखने के लिए जा रहे हैं किसी तरह से यूआई संशोधित करने के लिए है, तो आप से यह करना है को ध्यान में रखना अन्य सभी मामलों में मुख्य धागा यह बेहतर है कि यह एक और धागा का उपयोग करें।

0

यह मदद कर सकता है,

requestDisallowInterceptTouchEvent(true); 
जनक दृश्य पर

, इस तरह -

 @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      view.getParent().requestDisallowInterceptTouchEvent(true); 
      switch(motionEvent.getActio){ 
      } 

      return false; 

     }