Obtener coordenadas táctiles en relación con una vista (Equivalente a ScreenToClient?)

Tengo una imagen que estoy mostrando a un usuario en mi aplicación androide.

Quiero ser capaz de decir dónde "tocar" la imagen.

Puedo obtener fácilmente las coordenadas de pantalla mediante la implementación de un OnTouchListener

private OnTouchListener image_Listener = new OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_UP) { float x = event.getX(); float y = event.getY(); return true; } return false; } }; 

Sin embargo, éstas son coordenadas absolutas. Lo que realmente necesito es una función para convertir esto en coordenadas con respecto a una vista.

He hecho un poco de excavación, pero no puedo aparecer a nada, aparte de mí tratando de implementar un método ScreenToClient me ..

¿Alguien sabe de una buena solución a esto, o voy a tener que rodar el mío?

Parece que el tipo de método que estaría disponible – es por eso que estoy preguntando.

Gracias por su tiempo a todos.

EDIT: No estoy tan seguro de que las coordenadas no son ya relativas a la vista. Podría haber jurado leer que las coordenadas eran absolutas, pero después de algunos retoques – tengo cosas funcionando como esperaba .. Lo siento por los chicos de ruido.

Sólo para responder, los toques son relativos a la vista de una manera. Sí, son coordenadas de pantalla en bruto del tacto. Sin embargo, puesto que registra el evento táctil en la vista en sí, sólo se disparará si el usuario realmente toca la vista. Esto significa que, aunque las coordenadas de pantalla sean coordenadas de pantalla en bruto, están dentro de los límites de la vista en sí.

Si desea obtener las coordenadas x / y de la vista tocada en relación con ella, puede subractar la coordenada izquierda con la coordenada de la pantalla y la coordenada superior de la coordenada y así:

 private OnTouchListener image_Listener = new OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_UP) { float screenX = event.getX(); float screenY = event.getY(); float viewX = screenX - v.getLeft(); float viewY = screenY - v.getTop(); return true; } return false; } }; 

Con eso, si el usuario tocó 40 x-pixels en la pantalla, pero el margen izquierdo se estableció en 10, entonces viewX sería 30. Si movió la vista hacia abajo de 40 x píxeles y el usuario tocó el mismo punto en la vista , Todavía sería 30.

Se vuelve un poco más complicado si se incluye el relleno como relleno dentro de una vista todavía cuenta como una vista a pesar de que no muestra nada.

EDITAR:

Debo señalar que lo que dijo Pierre es cierto. Si toca una vista, seguirá recibiendo eventos táctiles hasta que se levante el dedo, incluso si arrastra el dedo fuera de los límites de la vista. Esto significa que ACTION_UP puede recibir coordenadas táctiles para su vista que no están dentro de los límites.

Acabo de tener el mismo problema, y ​​probar la solución de DeeV siempre tengo 0 de los métodos getLeft () y getTop (). Como cambiar la disposición no era una opción (porque pienso que getTop / Left son relativos solamente al padre de la visión) tuve que calcular hacia fuera cómo conseguir la posición absoluta de la visión.

Aquí hay un enfoque similar usando getLocationOnScreen (location):

 protected Point getRelativePosition(View v, MotionEvent event) { int[] location = new int[2]; v.getLocationOnScreen(location); float screenX = event.getRawX(); float screenY = event.getRawY(); float viewX = screenX - location[0]; float viewY = screenY - location[1]; return new Point((int) viewX, (int) viewY); } 

Las coordenadas del evento táctil son relativas a la vista que recibe el evento. Sin embargo, no se limitan al tamaño de View, ya que el usuario puede obviamente deslizar fuera de la vista en el mismo movimiento.

Hasta que se active ACTION_UP o ACTION_CANCEL, la vista seguirá recibiendo los eventos de movimiento incluso si el puntero está fuera de la vista.

¿Estás seguro de que el oyente está registrado en la Vista correcta?

  • Escuche el cierre de sesión de Facebook con el botón de inicio de sesión. (4.1)
  • Variables estáticas públicas y gestión del ciclo de vida de la actividad de Android
  • Validar precondiciones de función en android
  • ¿Cómo obtener la respuesta de cadena de Retrofit2?
  • Obtener el valor de cadena de un objeto de matriz JSON en Java
  • Android Speech Recognition API no funciona en Android 7 Nougat
  • Hora de Joda y error de ProGuard al exportar .apk
  • Uso de JAVA RMI en la aplicación de Android
  • ¿Dónde puedo encontrar una biblioteca JAVA de efectos visuales y manipulación de imágenes?
  • Integrar roboelectric con android studio con gradle siempre da paquetes org.junit no existe error
  • Función de Java que llama y devuelve valor en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.