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.
- Serializar objeto personalizado que contiene objetos JodaTime en JSON
- ¿Cómo puedo compartir recursos entre los diferentes proyectos de Eclipse, para evitar la duplicación?
- ¿Cómo enviar datos multipart / form a un servidor web desde android?
- ¿Cómo puedo hacer un ListView sensible al tacto en todo su ancho para hacer clic en un elemento?
- ¿No puede utilizar un método estático público?
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.
- Qué es stringentity en android y su uso
- ¿Cómo puedo mantener el estado al cambiar entre las pestañas / fragmentos de la barra de acción?
- ¿Es Android InflaterInputStream igual que la popular biblioteca de Windows de ZLIB?
- ¿Guardar el flujo de rtsp en android?
- Impresión POS / ESC Apex3 image SOS
- Utilizar glVertexAttribPointer y glDrawElements para extraer de un buffer de vértice empaquetado
- El servidor no admite la suite de cifrado predeterminada de Android 5.0
- Temporizadores Android NDK
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?
- Diferentes tamaños de texto para diferentes hardware
- Cómo reproducir un archivo de audio en una llamada de voz en android