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 MotionEvent
e 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 ImageView
e 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 ImageView
s não recebem um tamanho originalmente. O tamanho dos ImageView
s é 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.