2012-10-19 9 views
17

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

में स्पर्श ईवेंट का पता लगाना चाहता हूं

मैं दृश्य बी में स्पर्श श्रोता जोड़ा है, लेकिन घटनाओं प्राप्त नहीं होता है, तो उपयोगकर्ता शुरू में एक को छुआ और बी

से अधिक घसीटा

enter image description here

+0

[यह भी देखें] (http://stackoverflow.com/questions/13309111/programatically-execute-another-touch-event-when-one-touch-event-occures-in-andr) –

उत्तर

53

आप कर सकते हैं अपने अनुरोध को प्राप्त करने के लिए कोड का उपयोग करें:

विधि दृश्य सीमा का परीक्षण करने के साथ दो TextView

final TextView viewA = (TextView) findViewById(R.id.textView); 
    final TextView viewB = (TextView) findViewById(R.id.textView2); 

सेटअप viewA

खाली OnClickListener के लिए आवश्यक है (कोड beloow में प्रयोग किया जाता)

Rect outRect = new Rect(); 
    int[] location = new int[2]; 

    private boolean isViewInBounds(View view, int x, int y){ 
     view.getDrawingRect(outRect); 
     view.getLocationOnScreen(location); 
     outRect.offset(location[0], location[1]); 
     return outRect.contains(x, y); 
    } 

परीक्षणरखेंसक्रिय जब तक ACTION_UP

viewA.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) {} 
    }); 

    viewA.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      int x = (int)event.getRawX(); 
      int y = (int)event.getRawY(); 
      if(event.getAction() == MotionEvent.ACTION_UP){ 
       if(isViewInBounds(viewB, x, y)) 
        viewB.dispatchTouchEvent(event); 
       else if(isViewInBounds(viewA, x, y)){ 
        Log.d(TAG, "onTouch ViewA"); 
        //Here goes code to execute on onTouch ViewA 
       } 
      } 
      // Further touch is not handled 
      return false; 
     } 
    }); 

सेटअप viewB

यह केवल आवश्यक है अगर आप भी viewA

viewB.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) {} 
    }); 

    viewB.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      int x = (int)event.getRawX(); 
      int y = (int)event.getRawY(); 
      if(event.getAction() == MotionEvent.ACTION_UP){ 
       if(isViewInBounds(viewA, x, y)) 
        viewA.dispatchTouchEvent(event); 
       else if(isViewInBounds(viewB, x, y)){ 
        Log.d(TAG, "onTouch ViewB"); 
        //Here goes code to execute on onTouch ViewB 
       } 
      } 
      // Further touch is not handled 
      return false; 
     } 
    }); 

सादर को viewB और खींचें पर प्रेस करना चाहते हैं।

+1

2 से अधिक विचारों के मामले में कोड कैसा दिखता है? –

0

और खींचें का उपयोग करके देखें ड्रॉप ढांचा।

+4

यह केवल उपलब्ध है 3.0 या बाद के – Magakahn

1

मुझे यकीन है कि आपको अपने व्यू ग्रुप में ViewGroup.dispatchTouchEvent(MotionEvent ev) विधि को ओवरराइड करना होगा जिसमें व्यू ए और बी शामिल है। मूल कार्यान्वयन लक्ष्य दृश्य को परिभाषित करता है जब कंटेनर को MotionEvent.getAction() == MotionEvent.ACTION_DOWN प्राप्त होता है और फिर सभी निम्न स्पर्श ईवेंट को लक्ष्य दृश्य तक प्रेषित करता है MotionEvent.getAction() == MotionEvent.ACTION_UP या MotionEvent.ACTION_CANCEL

आपके मामले में लक्ष्य दृश्य ए या कंटेनर स्वयं है (आपके कंटेनर onInterceptTouchEvent(MotionEvent ev) विधि कार्यान्वयन पर निर्भर करता है)। तो आपको इस तरह के व्यवहार को ओवरराइड करना चाहिए और न केवल लक्ष्य दृश्य के लिए स्पर्श घटनाओं को प्रेषित करना चाहिए, बल्कि सभी विचारों के लिए, स्पर्श क्षेत्र के अंतर्गत (उदाहरण के लिए बी को देखने के लिए)।

यदि आप रुचि रखते हैं तो आप कोड नमूना साझा कर सकते हैं और मैं आपकी सहायता करने की कोशिश करूंगा।

+0

के लिए [मुझे भी इस पर समस्या है] (http://stackoverflow.com/questions/13309111/programatically-execute-another-touch-event-when-one-touch-event-occures-in-andr)। क्या आप सहायता के लिए कुछ डेमो कोड दे सकते हैं? –

0

जब आप व्यू बी पर हैं, तो इसे मैन्युअल रूप से onTouch पर कॉल करें।

if (viewBRect.contains(x, y)) { 
    viewBsonTouch(view, motionEvent); 
} 
1

यदि आप दृश्य ए के टचवेन्ट से सच लौट रहे हैं तो ईवेंट प्रचारित नहीं होता है। इस विशेष मामले में जब ए बी से नीचे है, तो देखने के झूठ से झूठी वापसी ए

यदि आप कुछ कोड पोस्ट कर सकते हैं तो यह भी मदद करेगा।

1

Viewएक में, ओवरराइड onTouchEvent इस प्रकार है:

@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 

    float x = event.getRawX(); 
    float y = event.getRawY(); 
    if ((B.getLeft() <= x <= B.getRight()) && 
     (B.getTop() <= y <= B.getBottom()) 
     ) 
    { 
     Log.i("A", "Motion Event is currently above B"); 
     B.dispatchTouchEvent(event); 
    } 

    return true; 
} 

View में बी,, एक ही विधि ओवरराइड सुनिश्चित करते हुए आप वापस झूठी:

@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 
    //TODO handle touch event 
    return false;//this will allow A to continue using the event 
} 
+0

चलो इसे @ dcanh121 पहले परीक्षण करें। या आप एक रचनात्मक टिप्पणी दे सकते हैं - जैसे कि आप क्यों मानते हैं कि यह काम नहीं करता है और आप कैसे मानते हैं कि इसे समायोजित किया जाना चाहिए। – Phil

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