ビューの左上隅の絶対スクリーンピクセル座標を取得しようとしています。しかし、すべてのメソッドは、私のような見つけることができます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とデフォルトの可視性の両方でpublic intを試しましたが、どちらも同じ結果が得られます。)
これが重要かどうかはわかりませんが、ImageView
sには元々サイズが与えられていません。ImageView
s のサイズは、初期化中に、表示する画像を指定すると、ビューによって自動的に決定されます。そのロギングコードは、画像が与えられて自動的にサイズが変更された後でも、これはそれらの値が0になる原因になりますか?これに対抗するために、tableLayout.requestLayout()
上記のコードを追加しましたが、効果がありませんでした。