¿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.
- Cómo agregar dos campos de texto de edición o vistas en un cuadro AlertDialog?
- FindViewById devuelve null - Android - setContentView
- ¿Cómo mover una vista en Android?
- Android: cómo crear una aplicación de pestañas compleja con vistas
- ¿Cómo posiciono el cuadro de diálogo personalizado en coordenadas específicas?
- Añadir más de dos vistas a ViewSwitcher
- Android addView en hilo de fondo
- Animación individual - vistas múltiples
- Notificación de pantalla de bloqueo de Android Vista personalizada con ripple y doble toque
- Stackoverflow error en la vista
- Android: Tablerow mezclado con columnas y texto multilínea
- Android OpenGL que extiende las excepciones de puntero nulo de GLSurfaceView
- Deshabilitar todas las vistas secundarias dentro del diseño
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.
- Crear un ArrayList de posibles objetivos
- 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.
Lee esto:
http://developer.android.com/reference/android/view/ViewGroup.html#onInterceptTouchEvent(android.view.MotionEvent)
http://developer.android.com/reference/android/view/View.html#onTouchEvent(android.view.MotionEvent)
Yo había implementado un arrastrar y soltar con ese método.
También recomiendo una lectura del código fuente de HomeScreen, que contiene esta cosa (tipo de):
https://android.googlesource.com/platform/packages/apps/Launcher2
- FusedLocationProviderApi.KEY_LOCATION_CHANGED obsoleta. ¿Qué hacer ahora?
- ¿Cómo hacer que la barra de herramientas en Android tenga un ancho completo?