2010-11-12 9 views

Respuesta

80

Bueno para cualquiera que quiera saber lo que hice ... no pude. Hice una solución para saber exactamente si se hizo clic en mi componente de vista específico, por lo que sólo podía terminar con esto:

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

y el método:

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

Sin embargo, esto sólo funciona para puntos de vista por la diseño que puede pasar como parámetro, todavía no puedo obtener la vista cliqueada simplemente conociendo las coordenadas. Sin embargo, puede buscar todas las vistas en el diseño.

+9

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

+0

Sugerencia: gran candidato de método para hacerse estático. – m0skit0

+6

@etienne, tenga en cuenta que getDrawingRect() devuelve información sobre el trazado de dibujo que se muestra dentro de una vista de desplazamiento. No funciona si desea obtener la rect de una vista anidada en otra vista. La solución de htafoya funciona como se esperaba. – sulai

3

Una manera simple de obtener la vista tocada es establecer OnTouchListener a las vistas individuales y almacenar la vista en una variable de clase de la actividad. Si se devuelve false, el evento de entrada estará disponible para el método onTouchEvent() de la actividad, donde puede manejar fácilmente todos los eventos táctiles (también los de su vista principal).

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

Sólo para hacer método de htafoya más simple:

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

Repitiendo mi comentario de arriba: view.getLocationOnScreen realmente no funcionó para mí - Creo que puede devolver las coordenadas del centro de la vista, por lo que el clic debe estar en la esquina inferior derecha de la vista para que la prueba sea verdadera , por lo que la comprobación de límites en este ejemplo es incorrecta. En su lugar, use esta prueba: (x> = view.getLeft() && x <= view.getRight()) && (y> = view.getTop() && y <= view.getBottom()). – gjgjgj

Cuestiones relacionadas