Estoy tratando de obtener las coordenadas absolutas de píxeles de la pantalla de la esquina superior izquierda de una vista. Sin embargo, todos los métodos que puedo encontrar como getLeft()
y getRight()
no funcionan, ya que todos parecen ser relativos al padre de la vista, lo que me da 0
. ¿Cuál es la forma apropiada de hacer esto?
Si ayuda, esto es para un juego de "poner la imagen de nuevo en orden". Quiero que el usuario pueda dibujar un cuadro para seleccionar varias piezas. Mi suposición es que la forma más fácil de hacerlo es hacia getRawX()
y getRawY()
desde el MotionEvent
y luego comparar esos valores con la esquina superior izquierda del diseño que contiene las piezas. Conociendo el tamaño de las piezas, puedo determinar cuántas piezas se han seleccionado. Me doy cuenta de que puedo usar getX()
y getY()
en el MotionEvent
, pero como eso devuelve una posición relativa que hace que determinar qué piezas fueron seleccionadas sea más difícil. (No es imposible, lo sé, pero parece innecesariamente complicado).
Editar: este es el código que usé para tratar de obtener el tamaño del contenedor de retención, según una de las preguntas. TableLayout
es la mesa que contiene todas las piezas del rompecabezas.
TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
Log.d(LOG_TAG, "Values " + tableLayout.getTop() + tableLayout.getLeft());
Edición 2: Aquí está el código que he probado, siguiendo más de las respuestas sugeridas.
public int[] tableLayoutCorners = new int[2];
(...)
TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
tableLayout.requestLayout();
Rect corners = new Rect();
tableLayout.getLocalVisibleRect(corners);
Log.d(LOG_TAG, "Top left " + corners.top + ", " + corners.left + ", " + corners.right
+ ", " + corners.bottom);
cells[4].getLocationOnScreen(tableLayoutCorners);
Log.d(LOG_TAG, "Values " + tableLayoutCorners[0] + ", " + tableLayoutCorners[1]);
Este código se agregó después de completar toda la inicialización. La imagen se ha dividido en una matriz de ImageViews (la matriz de celdas []) contenida dentro de a TableLayout
. Las celdas [0] están en la parte superior izquierda ImageView
, y elegí las celdas [4] ya que está en algún lugar en el medio y definitivamente no debería tener coordenadas de (0,0).
El código que se muestra arriba todavía me da todos los 0 en los registros, lo que realmente no entiendo porque las diversas piezas del rompecabezas se muestran correctamente. (Intenté public int para tableLayoutCorners y la visibilidad predeterminada, ambos dieron el mismo resultado).
No sé si esto es significativo, pero los ImageView
s originalmente no tienen un tamaño. El tamaño de los ImageView
s se determina durante la inicialización automáticamente por la Vista cuando le doy una imagen para mostrar. ¿Podría esto contribuir a que sus valores sean 0, a pesar de que el código de registro es después de que se les haya dado una imagen y se hayan redimensionado automáticamente? Para contrarrestar eso, agregué el código tableLayout.requestLayout()
como se muestra arriba, pero eso no ayudó.