2010-11-12 13 views

Odpowiedz

80

Dobrze dla każdego, kto chce wiedzieć, co zrobiłem ... nie mogłem. Zrobiłem obejście po prostu wiedzieć, czy mój specyficzny składnik pogląd został kliknięty, więc mogłem skończyć tylko z tym:

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

i metoda:

/** 
* 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; 
    } 
} 

Jednak to działa tylko dla znanych widoków w układ, który można przekazać jako parametr, nadal nie mogę uzyskać klikniętego widoku po prostu znając współrzędne. Możesz jednak wyszukać wszystkie widoki w układzie.

+9

private boolean isPointInsideView (float x, float y, view) { \t \t Rect rect = new Rect(); \t \t view.getDrawingRect (rect); \t \t return rect.contains ((int) x, (int) y); \t} – etienne

+0

Sugestia: świetny kandydat na metodę, która ma być statyczna. – m0skit0

+6

@etienne, należy pamiętać, że getDrawingRect() zwraca informacje o rysunku rect pokazanym wewnątrz widoku przewijania. Nie działa, jeśli chcesz uzyskać widok, który jest zagnieżdżony w innym widoku. Rozwiązanie htafoya działa zgodnie z oczekiwaniami. – sulai

3

Prostym sposobem na uzyskanie dotkniętego widoku jest ustawienie OnTouchListener na poszczególne widoki i zapisanie widoku w zmiennej klasy działania. Zwrócenie wartości false spowoduje udostępnienie zdarzenia wejściowego dla metody onTouchEvent() działania, w którym można łatwo obsłużyć wszystkie zdarzenia dotyku (także te w widoku nadrzędnym).

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

Wystarczy, aby metoda htafoya prostsze:

/** 
* 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

Powtarzanie mojego komentarza z góry: view.getLocationOnScreen nie działa dla mnie - myślę, że może zwrócić współrzędne centrum widoku, więc kliknięcie musi znajdować się w prawym dolnym rogu widoku, aby test powrócił true , więc sprawdzanie granic w tym przykładzie jest błędne. Zamiast tego użyj tego testu: (x> = view.getLeft() && x <= view.getRight()) && (y> = view.getTop() && y <= view.getBottom()). – gjgjgj

Powiązane problemy