1. ホーム
  2. android

[解決済み] ビューの絶対座標を取得する方法

2022-03-21 13:04:07

質問

ビューの左上隅の絶対画面ピクセル座標を取得しようとしています。しかし、私が見つけることができるすべてのメソッドは、次のとおりです。 getLeft()getRight() は、すべてビューの親に対する相対パスであるため、うまくいきません。 0 . このような場合、どのようにすればよいのでしょうか?

参考になるなら、これは「絵を順番に戻す」ゲーム用です。ユーザーが複数のピースを選択するためにボックスを描けるようにしたいのです。私の仮定では、それを行う最も簡単な方法は、次のとおりです。 getRawX()getRawY() から MotionEvent の値を、ピースのあるレイアウトの左上隅と比較します。ピースのサイズがわかれば、何個のピースが選択されたかを判断することができます。私は getX()getY() を使用します。 MotionEvent しかし、これは相対的な位置を返すので、どのピースが選択されたかを判断するのが難しくなります。(不可能ではないとは思いますが、不必要に複雑な気がします)。

編集:これは、質問の1つにあるように、保持コンテナのサイズを取得しようとしたときに使用したコードです。 TableLayout は、すべてのパズルのピースを収納するテーブルです。

TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
Log.d(LOG_TAG, "Values " + tableLayout.getTop() + tableLayout.getLeft());

編集2:以下は、提案された答えの多くに従って、私が試したコードです。

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]);

このコードは、すべての初期化が完了した後に追加されました。画像はImageViewsの配列(cell[]配列)に分割され、その配列は TableLayout . Cells[0]は左上の ImageView そして、cell[4]は真ん中のどこかにあり、間違いなく座標が(0,0)になってはいけないと思い、選びました。

上記のコードでは、ログにすべて0が表示されてしまいます。(tableLayoutCorners と default visibility に public int を試してみましたが、どちらも同じ結果でした)。

意味があるかどうかわかりませんが ImageView は、もともとサイズが与えられていません。サイズは ImageView は、初期化中に、表示する画像を与えると、Viewが自動的に決定します。このため、画像が表示され、自動的にサイズが変更された後のログ記録であるにもかかわらず、値が0になっているのではないでしょうか?この問題に対処するために、私は以下のコードを追加しました。 tableLayout.requestLayout() を上記のようにしましたが、それでもダメでした。

解決方法は?

使用方法 View.getLocationOnScreen() または getLocationInWindow() .