2012-06-09 36 views
11

निर्देशांक द्वारा दृश्य में तत्व कैसे ढूंढें यदि मुझे निर्देशांक (एक्स, वाई) पिक्सेल (ऑन टचवेन्ट विधि और getX(), getY) मैं तत्व को कैसे प्राप्त कर सकता हूं। बटन या टेक्स्ट इत्यादि .... एक्स, वाईएक्स, वाई एंड्रॉइड

उत्तर

15

आप प्रत्येक बच्चे के getHitRect(outRect) का उपयोग कर सकते हैं और जांच सकते हैं कि बिंदु परिणामस्वरूप आयत में है या नहीं। यहां एक त्वरित नमूना है।

for(int _numChildren = getChildCount(); --_numChildren) 
{ 
    View _child = getChildAt(_numChildren); 
    Rect _bounds = new Rect(); 
    _child.getHitRect(_bounds); 
    if (_bounds.contains(x, y) 
     // In View = true!!! 
} 

आशा इस मदद करता है,

FuzzicalLogic

+1

मैंने कोशिश की है और यह काम करता है। –

+0

बहुत अच्छा काम करता है लेकिन ऐसा लगता है कि बच्चा शून्य हो सकता है, इसलिए NullPointerException को रोकने के लिए चेक की आवश्यकता है। –

+0

यह सही काम करता है। –

0

एंड्रॉयड उपयोग dispatchKeyEvent/dispatchTouchEvent कुंजी/स्पर्श घटना को संभालने के लिए सही देखने लगता है, यह एक जटिल प्रक्रिया है। चूंकि कई विचारों में (x, y) बिंदु शामिल हो सकता है।

लेकिन अगर आप बस सबसे जहाज़ की छत पर राय यह है कि (एक्स, वाई) बिंदु को कवर लगाना चाहते हैं यह आसान है।

1 getLocationOnScreen उपयोग करें() absoulte स्थिति प्राप्त करने के लिए।

2 getWidth उपयोग करें(), getHeight() यह पता लगाने की है कि क्या दृश्य (एक्स, वाई) बिंदु को कवर किया।

3 Cacluate पूरे दृश्य पेड़ में देखने का स्तर। (GetParent (कॉल) रिकर्सिवली या कुछ खोज विधि का उपयोग करें)

4 का मानना ​​है कि दोनों बिंदु को कवर किया और सबसे बड़ी स्तर का पता लगाएं।

4

एक से थोड़ा अधिक पूरा जवाब है कि किसी भी ViewGroup स्वीकार करता है और रिकर्सिवली में दिया एक्स दृश्य, वाई के लिए खोज करेंगे।

private View findViewAt(ViewGroup viewGroup, int x, int y) { 
    for(int i = 0; i < viewGroup.getChildCount(); i++) { 
     View child = viewGroup.getChildAt(i); 
     if (child instanceof ViewGroup) { 
      View foundView = findViewAt((ViewGroup) child, x, y); 
      if (foundView != null && foundView.isShown()) { 
       return foundView; 
      } 
     } else { 
      int[] location = new int[2]; 
      child.getLocationOnScreen(location); 
      Rect rect = new Rect(location[0], location[1], location[0] + child.getWidth(), location[1] + child.getHeight()); 
      if (rect.contains(x, y)) { 
       return child; 
      } 
     } 
    } 

    return null; 
} 
1

ही समाधान https://stackoverflow.com/a/10959466/2557258 के रूप में लेकिन kotlin में:

fun getViewByCoordinates(viewGroup: ViewGroup, x: Float, y: Float) : View? { 
    (0 until viewGroup.childCount) 
      .map { viewGroup.getChildAt(it) } 
      .forEach { 
       val bounds = Rect() 
       it.getHitRect(bounds) 
       if (bounds.contains(x.toInt(), y.toInt())) { 
        return it 
       } 
      } 
    return null 
} 
संबंधित मुद्दे