Obtener la posición de toque al arrastrar

Tengo algunas vistas que me gusta arrastrar. Las vistas están dentro de un LinearLayout, que está dentro de una vista de desplazamiento.

Quiero conseguir la posición del dedo actual (tacto), para hacer un desplazamiento liso en mi vista de desplazamiento, dependiendo de la altura de la fricción actual.

Comienzo mi draggin después de un tecleo largo con el oyente de la estructura de la visión startDrag

view.startDrag(null, shadowBuilder, view, 0); 

También soy capaz de obtener la posición relativa de la resistencia en la vista que actualmente está en el aire

 view.setOnDragListener(new OnDragListener() { @Override public boolean onDrag(View v, DragEvent event) { //get event positions } }); 

Pero esto sólo funciona para la vista donde está actualmente la sombra de arrastre y DragEvent sólo proporciona posiciones relativas, no posiciones en bruto.

Lo que necesito es la posición del dedo, mientras que el arrastre sucede. Desafortunadamente todos los onTouchEvents consiguen consumidos mientras que arrastran.

¿Alguien sabe cómo conseguir que esto funcione?

Ps: Una manera que funciona (tipo de) que uso actualmente, es calcular la posición del tacto vía el dragEvent.relativePosition en combinación con la posición de la visión. ¿Pero no hay una mejor manera de ir?

OK, ya que no parece ser una respuesta más fácil, voy a proporcionar mi propia solución relativamente fácil para los lectores más, sin necesidad de detección de gestos.

Al principio se necesita la vista que recibe el evento de arrastrar y en segundo lugar el evento de arrastre ifself (o al menos las coordenadas xey). Con la obtención de la posición de la vista y de alguna adición simple usted consigue la posición del tacto crudo.

Este método se prueba con las opciones de revelador de posición del puntero de muestra para proporcionar los datos correctos.

El método para el cálculo se ve así:

 /** * @param item the view that received the drag event * @param event the event from {@link android.view.View.OnDragListener#onDrag(View, DragEvent)} * @return the coordinates of the touch on x and y axis relative to the screen */ public static Point getTouchPositionFromDragEvent(View item, DragEvent event) { Rect rItem = new Rect(); item.getGlobalVisibleRect(rItem); return new Point(rItem.left + Math.round(event.getX()), rItem.top + Math.round(event.getY())); } 

Llame a este método dentro de su implementación onDragListener:

 @Override public boolean onDrag(View v, DragEvent event) { switch (event.getAction()) { case DragEvent.ACTION_DRAG_STARTED: //etc etc. do some stuff with the drag event break; case DragEvent.ACTION_DRAG_LOCATION: Point touchPosition = getTouchPositionFromDragEvent(v, event); //do something with the position (a scroll ie); break; default: } return true; } 

Adicional: Si desea determinar si el toque está dentro de una vista específica, puede hacer algo como esto:

  public static boolean isTouchInsideOfView(View view, Point touchPosition) { Rect rScroll = new Rect(); view.getGlobalVisibleRect(rScroll); return isTouchInsideOfRect(touchPosition, rScroll); } public static boolean isTouchInsideOfRect(Point touchPosition, Rect rScroll) { return touchPosition.x > rScroll.left && touchPosition.x < rScroll.right //within x axis / width && touchPosition.y > rScroll.top && touchPosition.y < rScroll.bottom; //withing y axis / height } 

También he implementado un scroll suave en un listview basado en esta solución. Para que el usuario pueda arrastrar un elemento fuera de una lista y desplazarse por la lista arrastrando el elemento a la parte superior o inferior de la vista de lista. Si alguien está interesado en él, puedo proporcionar un vínculo adicional a la implementación.

Aclamaciones.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.