Estou tentando obter as coordenadas absolutas de pixels da tela no canto superior esquerdo de uma visualização. No entanto, todos os métodos que posso encontrar como getLeft()e getRight()não funcionam, pois todos parecem ser relativos ao pai da visualização, fornecendo-me assim 0. Qual é a maneira correta de fazer isso?
Se ajudar, isso é para um jogo de 'colocar a foto de volta em ordem'. Quero que o usuário possa desenhar uma caixa para selecionar várias peças. Minha suposição é que a maneira mais fácil de fazer isso é ir getRawX()e getRawY()vir de MotionEvente comparar esses valores com o canto superior esquerdo do layout que contém as peças. Conhecendo o tamanho das peças, posso determinar quantas peças foram selecionadas. Sei que posso usar getX()e getY()no MotionEvent, mas como isso retorna uma posição relativa que torna mais difícil determinar quais peças foram selecionadas. (Não é impossível, eu sei, mas parece desnecessariamente complicado).
Edit: Este é o código que eu usei para tentar obter o tamanho do contêiner de retenção, conforme uma das perguntas. TableLayouté a mesa que contém todas as peças do quebra-cabeça.
TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
Log.d(LOG_TAG, "Values " + tableLayout.getTop() + tableLayout.getLeft());
Edit 2: Aqui está o código que eu tentei, seguindo mais das respostas 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 foi adicionado após toda a inicialização. A imagem foi dividida em uma matriz de ImageViews (a matriz de células []) contida em a TableLayout. As células [0] estão no canto superior esquerdo ImageViewe eu escolhi as células [4], pois estão em algum lugar no meio e, definitivamente, não devem ter coordenadas de (0,0).
O código mostrado acima ainda me dá todos os 0s nos logs, o que eu realmente não entendo porque as várias peças do quebra-cabeça são exibidas corretamente. (Tentei public int para tableLayoutCorners e visibilidade padrão, ambos dando o mesmo resultado.)
Não sei se isso é significativo, mas os ImageViews não recebem um tamanho originalmente. O tamanho dos ImageViews é determinado durante a inicialização automaticamente pela Visualização quando eu mostro uma imagem a ser exibida. Isso poderia contribuir para que seus valores fossem 0, mesmo que o código de registro ocorra depois de receberem uma imagem e se redimensionarem automaticamente? Para potencialmente combater isso, adicionei o código tableLayout.requestLayout()como mostrado acima, mas isso não ajudou.