ビューの絶対座標を取得する方法 質問する

ビューの絶対座標を取得する方法 質問する

ビューの左上隅の絶対画面ピクセル座標を取得しようとしています。しかし、 や などのすべてのメソッドは、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 の配列 (cells[] 配列) に分割されていますTableLayout。Cells[0] は左上 でImageView、cells[4] は中央のどこかにあり、座標が (0,0) になるはずがないため、これを選択しました。

上記のコードでは、ログにはまだすべて 0 が出力されますが、さまざまなパズルのピースは正しく表示されているため、まったく理解できません。(tableLayoutCorners と default visibility に public int を試しましたが、どちらも同じ結果になりました。)

これが重要かどうかはわかりませんが、ImageViews には元々サイズが指定されていません。s のサイズは、ImageView表示する画像を指定したときに View によって初期化中に自動的に決定されます。ログ記録コードは画像が指定され、自動的にサイズが変更された後であるにもかかわらず、値が 0 になる原因となっている可能性がありますか? これに対抗するために、tableLayout.requestLayout()上記のコードを追加しましたが、役に立ちませんでした。

ベストアンサー1

おすすめ記事