¿Cómo puede detectar la vista que está pasando cuando realiza un evento táctil?

Quiero saber cómo puedo detectar vistas secundarias si muevo una vista de un grupo de vistas a otro grupo de vistas, en particular al realizar un evento de toque. ¿Hay un método que puedo llamar que me dejará saber qué vistas estoy "flotando" más?

Lo que estoy haciendo ahora es cuando detecto un evento ACTION_MOVE en mi vista, lo estoy elevando al padre de nivel superior para que pueda moverse y dibujarse dentro de toda la ventana (y no solo dentro de sus límites originales), entonces quiero mover la vista a través de un ViewGroup diferente y en ACTION_UP adjuntar la vista a ese ViewGroup.

Inspirado en la respuesta de Ami, pero descubriendo que MotionEvent # getX () / getY () junto con View # getTop () / etc devuelven las coordenadas a la vista primaria, terminé haciendo lo siguiente para operar en coordenadas de pantalla, permitiéndome trabajar a través de ViewGroups:

private boolean inRegion(float x, float y, View v) { v.getLocationOnScreen(mCoordBuffer); return mCoordBuffer[0] + v.getWidth() > x && // right edge mCoordBuffer[1] + v.getHeight() > y && // bottom edge mCoordBuffer[0] < x && // left edge mCoordBuffer[1] < y; // top edge } 

cuyo uso dentro de un OnTouchListener es por ejemplo:

  boolean inside = inRegion(event.getRawX(), event.getRawY(), targetView); 

Creo que encontré una manera más sencilla de hacer esto.

  1. Crear un ArrayList de posibles objetivos
  2. Llame a este método desde su evento táctil, proporcionando su lista de objetivos y las coords
 private View findView(float x, float y, ArrayList<View> targets) { final int count = targets.size(); for (int i = 0; i < count; i++) { final View target = targets.get(i); if (target.getRight() > x && target.getTop() < y && target.getBottom() > y && target.getLeft() < x) { return target; } } return null; } 

Encontré la respuesta de Sebastian Roth muy útil con recursos, pero como no era realmente una respuesta a mi pregunta, pensé que compartiría lo que me ocurrió.

Aquí está el código que utilizo para detectar puntos de vista (sólo las vistas que aceptarán una caída que es) dado una coordenada en la pantalla.

  private DropView findDropTarget( int x, int y, int[] dropCoordinates ){ final Rect r = mRectTemp; final ArrayList<DropView> dropTargets = ((main) context).getBoardDropTargets(); final int count = dropTargets.size(); for (int i=count-1; i>=0; i--) { final DropView target = dropTargets.get(i); target.getHitRect(r); target.getLocationOnScreen(dropCoordinates); r.offset(dropCoordinates[0] - target.getLeft(), dropCoordinates[1] - target.getTop()); if (r.contains(x, y)) { dropCoordinates[0] = x - dropCoordinates[0]; dropCoordinates[1] = y - dropCoordinates[1]; return target; } } } 

Ok, en primer lugar mRectTemp es sólo un rectángulo asignado por lo que no tiene que seguir creando nuevos (IE final Rect r = new Rect ())

La siguiente línea dropTargets es una lista de vistas que aceptará una caída en mi aplicación. A continuación paso por cada vista.

A continuación, utilizar getHitRect (r) para volver a la pantalla coordiantes de la vista.

A continuación, compensar a los coordiantes a cuenta de la barra de notificación o cualquier otra vista que podría desplazar a las coordiantes.

finalmente veo si x e y están dentro de las coordenadas del rectángulo dado r (xey son el event.rawX () y event.rawY ()).

En realidad resultó ser más simple de lo esperado y funciona muy bien.

  • Split motion events - acepta entradas simultáneamente a varias vistas
  • Adición de vistas a un grupo de vistas de Android mediante programación
  • Android instanceof detectar todos los widgets?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.