2010-11-12 13 views
24

मैं onInterceptTouchEvent (MotionEvent ev) के साथ अपने मूल दृश्य पर स्पर्श घटनाओं को रोकना चाहता हूं।एंड्रॉइड में किसी ईवेंट निर्देशांक से दृश्य कैसे प्राप्त करें?

वहां से मैं जानना चाहता हूं कि अन्य चीजों को करने के लिए कौन सा दृश्य क्लिक किया गया था, क्या यह जानने का कोई तरीका है कि उस गति घटना से कौन सा दृश्य क्लिक किया गया था?

उत्तर

80

ठीक है जो भी जानना चाहता है कि मैंने क्या किया ... मैं नहीं कर सका। मैं एक समाधान सिर्फ जानना चाहता है कि मेरा विशेष दृश्य घटक क्लिक किया गया था किया था, इसलिए मैं केवल इस के साथ समाप्त कर सकते हैं:

if(isPointInsideView(ev.getRawX(), ev.getRawY(), myViewComponent)){ 
    doSomething() 
    } 

और विधि:

/** 
* Determines if given points are inside view 
* @param x - x coordinate of point 
* @param y - y coordinate of point 
* @param view - view object to compare 
* @return true if the points are within view bounds, false otherwise 
*/ 
public static boolean isPointInsideView(float x, float y, View view){ 
    int location[] = new int[2]; 
    view.getLocationOnScreen(location); 
    int viewX = location[0]; 
    int viewY = location[1]; 

    //point is inside view bounds 
    if((x > viewX && x < (viewX + view.getWidth())) && 
      (y > viewY && y < (viewY + view.getHeight()))){ 
     return true; 
    } else { 
     return false; 
    } 
} 

हालांकि में जाना जाता है विचारों के लिए यह केवल काम करता है लेआउट जिसे आप पैरामीटर के रूप में पास कर सकते हैं, मैं अभी भी निर्देशांक को जानकर क्लिक किए गए दृश्य को नहीं प्राप्त कर सकता हूं। हालांकि आप लेआउट में सभी विचारों की खोज कर सकते हैं।

+9

निजी बूलियन isPointInsideView {(नाव एक्स, वाई, देखें दृश्य फ्लोट) \t \t रेक्ट रेक्ट = नए रेक्ट(); \t \t view.getDrawingRect (rect); \t \t वापसी rect.contains ((int) x, (int) y); \t} – etienne

+0

सुझाव: महान विधि उम्मीदवार स्थिर बनने के लिए। – m0skit0

+6

@etienne, कृपया ध्यान दें कि getDrawingRect() स्क्रॉल व्यू के अंदर दिखाए गए ड्राइंग रेक्ट के बारे में जानकारी देता है। यह काम नहीं करता है अगर आप किसी ऐसे दृश्य के रेक्ट को प्राप्त करना चाहते हैं जो किसी अन्य दृश्य में घोंसला है। htafoya का समाधान अपेक्षित के रूप में काम करता है। – sulai

3

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

myView.setOnTouchListener(new OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent event) { 
    touchedView = myView; 
    return false; 
    } 
}); 


@Override 
public boolean onTouchEvent(MotionEvent event) { 


    switch (event.getAction()) { 

     case MotionEvent.ACTION_UP: 

      if(touchedView!=null) { 
       doStuffWithMyView(touchedView); 
      .... 
      .... 
3

बस htafoya की विधि सरल बनाने के लिए:

/** 
* Determines if given points are inside view 
* @param x - x coordinate of point 
* @param y - y coordinate of point 
* @param view - view object to compare 
* @return true if the points are within view bounds, false otherwise 
*/ 
private boolean isPointInsideView(float x, float y, View view) { 
    int location[] = new int[2]; 
    view.getLocationOnScreen(location); 
    int viewX = location[0]; 
    int viewY = location[1]; 

    // point is inside view bounds 
    return ((x > viewX && x < (viewX + view.getWidth())) && 
      (y > viewY && y < (viewY + view.getHeight()))); 
} 
+0

उपरोक्त से मेरी टिप्पणी दोहराएं: view.getLocationOnScreen वास्तव में मेरे लिए काम नहीं करता - मुझे लगता है कि यह दृश्य के केंद्र निर्देशांक वापस कर सकता है, इसलिए क्लिक को सही करने के लिए दृश्य के निचले दाएं कोने में होना चाहिए , इसलिए इस उदाहरण में सीमाएं जांच गलत है। इसके बजाय, इस परीक्षण का उपयोग करें: (x> = view.getLeft() && x <= view.getRight()) && (y> = view.getTop() && y <= view.getBottom())। – gjgjgj

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