View クラスのドキュメントによると:
ビューのジオメトリは、長方形のジオメトリです。ビューには、左と上の座標のペアで表される位置と、幅と高さで表される 2 つの次元があります。位置と寸法の単位はピクセルです。
メソッド getLeft() および getTop() を呼び出して、ビューの位置を取得することができます。前者は、ビューを表す四角形の左座標または X 座標を返します。後者は、ビューを表す四角形の上部 (Y) 座標を返します。
さらに、不必要な計算を避けるために、getRight() と getBottom() といういくつかの便利なメソッドが提供されています。これらのメソッドは、ビューを表す四角形の右端と下端の座標を返します。たとえば、getRight() の呼び出しは、次の計算に似ています: getLeft() + getWidth()。
上記の私の解釈では、ビューの位置は「左」と「上」の値によって制御され、幅と高さは「幅」と「高さ」の値によって制御されます。これは、「右」が左と幅を追加することによって導出される最後の文を考慮すると、特に明確に思えます。
それにもかかわらず、setLeft() や setTop() を使用してビューの位置を変更すると、ビューのサイズが画面上で変わります! 一方、ビューの右下隅は元の場所に固定されたままです。この動作は、「右」と「下」が実際の値であり、ドキュメントで説明されているように導出されていないことを意味します。
では、ここで実際に何が起こっているのでしょうか。ドキュメントは 1 つのことを言いますが、動作は反対です。ビューを再配置する適切な方法は何ですか?
編集: RelativeLayout を追加しました:
myParams = new RelativeLayout.LayoutParams(300,300);
myParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
myParams.addRule(RelativeLayout.CENTER_VERTICAL);
myView.setLayoutParams(myParams);
...画面の中央に 300x300 のビューを作成します。完璧に動作します。しかし、その RelativeLayout を調べると、場所は leftMargin と topMargin によって制御されているようですが、どちらもゼロです。これにより、1) LayoutParams を調べて View が現在どこにあるかを知るにはどうすればよいか、2) LayoutParams を変更して別の場所に移動するにはどうすればよいかという疑問が生じます。
編集: 実験として、ビューに onTouch メソッドを追加し、その中でこれを行いました (抜粋):
if (MotionEvent.ACTION_MOVE == iAction) {
myParams = (RelativeLayout.LayoutParams) v.getLayoutParams();
myParams.leftMargin = 0;
myParams.topMargin = 0;
v.setLayoutParams(myParams);
}
...私の垂直方向および水平方向の中央にあるビューが画面の左上隅に移動するという理論に基づいています。結果:まったく動かない。.leftMargin と .topMargin はすでにゼロだったので、まったく驚くことではありませんが、ここに何らかの魔法が隠れている場合に備えて、試してみたかったのです。
他の提案?