2012-06-09 16 views

risposta

15

È possibile utilizzare getHitRect(outRect) di ogni vista figlio e controllare se il punto si trova nel rettangolo risultante. Ecco un rapido esempio.

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

Spero che questo aiuti,

FuzzicalLogic

+1

Ho provato e funziona. –

+0

Funziona alla grande ma sembra che il bambino possa essere nullo, quindi è necessario un controllo per prevenire NullPointerException. –

+0

funziona perfettamente. –

0

utilizzare Android dispatchKeyEvent/dispatchTouchEvent per trovare la vista diritto di gestire l'evento chiave/touch, si tratta di una procedura complessa. Dal momento che potrebbero esserci molte viste coprire il punto (x, y).

Ma è semplice se si vuole solo trovare la vista più in alto che copre il punto (x, y).

1 Utilizzare getLocationOnScreen() per ottenere la posizione absoulte.

2 Utilizzare getWidth(), getHeight() per capire se la vista copre il punto (x, y).

3 Cacificare il livello di visualizzazione nell'albero di visualizzazione intera. (Chiama getParent() in modo ricorsivo o usa un metodo di ricerca)

4 Trova la vista che copre sia il punto che il livello più grande.

4

Una risposta leggermente più completa che accetta qualsiasi ViewGroup e ricercherà in modo ricorsivo la vista alla data x, y.

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

la stessa soluzione https://stackoverflow.com/a/10959466/2557258 ma in 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 
} 
Problemi correlati