Androidでビューの絶対位置を設定することは可能ですか? (私はAbsoluteLayout
があることを知っていますが、それは非推奨です...)
たとえば、240 x 320 pxの画面がある場合、その中心が(100,100)になるように20 x 20 pxのImageView
を追加するにはどうすればよいですか。
RelativeLayoutを使うことができます。レイアウト内の位置(50,60)に30x40のImageViewが必要だったとしましょう。あなたの活動のどこかで:
// Some existing RelativeLayout from your layout xml
RelativeLayout rl = (RelativeLayout) findViewById(R.id.my_relative_layout);
ImageView iv = new ImageView(this);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(30, 40);
params.leftMargin = 50;
params.topMargin = 60;
rl.addView(iv, params);
その他の例
(50,60)と(80,90)にそれぞれ2つの30x40 ImageView(1つの黄色、1つの赤)を配置します。
RelativeLayout rl = (RelativeLayout) findViewById(R.id.my_relative_layout);
ImageView iv;
RelativeLayout.LayoutParams params;
iv = new ImageView(this);
iv.setBackgroundColor(Color.YELLOW);
params = new RelativeLayout.LayoutParams(30, 40);
params.leftMargin = 50;
params.topMargin = 60;
rl.addView(iv, params);
iv = new ImageView(this);
iv.setBackgroundColor(Color.RED);
params = new RelativeLayout.LayoutParams(30, 40);
params.leftMargin = 80;
params.topMargin = 90;
rl.addView(iv, params);
1つの30 x 40黄色のImageViewを(50,60)に配置し、もう1つの30 x 40黄色のImageViewを<80,90>に配置します。 に関連して 黄色のImageView:
RelativeLayout rl = (RelativeLayout) findViewById(R.id.my_relative_layout);
ImageView iv;
RelativeLayout.LayoutParams params;
int yellow_iv_id = 123; // Some arbitrary ID value.
iv = new ImageView(this);
iv.setId(yellow_iv_id);
iv.setBackgroundColor(Color.YELLOW);
params = new RelativeLayout.LayoutParams(30, 40);
params.leftMargin = 50;
params.topMargin = 60;
rl.addView(iv, params);
iv = new ImageView(this);
iv.setBackgroundColor(Color.RED);
params = new RelativeLayout.LayoutParams(30, 40);
params.leftMargin = 80;
params.topMargin = 90;
// This line defines how params.leftMargin and params.topMargin are interpreted.
// In this case, "<80,90>" means <80,90> to the right of the yellow ImageView.
params.addRule(RelativeLayout.RIGHT_OF, yellow_iv_id);
rl.addView(iv, params);
一般的には、leftMargin属性とtopMargin属性を指定することで、FrameLayoutをコンテナーとして使用して特定の位置にビューを追加できます。
次の例では、フルスクリーンコンテナとしてFrameLayoutを使用して、20 x 20ピクセルのImageViewを(100,200)の位置に配置します。
XML
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/root"
Android:background="#33AAFF"
Android:layout_width="match_parent"
Android:layout_height="match_parent" >
</FrameLayout>
アクティビティ/フラグメント/カスタムビュー
//...
FrameLayout root = (FrameLayout)findViewById(R.id.root);
ImageView img = new ImageView(this);
img.setBackgroundColor(Color.RED);
//..load something inside the ImageView, we just set the background color
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(20, 20);
params.leftMargin = 100;
params.topMargin = 200;
root.addView(img, params);
//...
マージンはRelativeLayoutなしで絶対(X、Y)座標として使用できるので、これはうまくいきます。
上記のAndy Zhangの回答に追加するために、必要に応じて、rl.addViewにparamを指定して、後で変更することができます。
params = new RelativeLayout.LayoutParams(30, 40);
params.leftMargin = 50;
params.topMargin = 60;
rl.addView(iv, params);
同様に書くことができます:
params = new RelativeLayout.LayoutParams(30, 40);
rl.addView(iv, params);
params.leftMargin = 50;
params.topMargin = 60;
そのため、params変数を保持している場合は、rlに追加した後はいつでもivのレイアウトを変更できます。
コード内のピクセル値をハードコーディングしなくても、よりクリーンで動的な方法です。
クリックしたボタンの真下にダイアログを配置したかったのです。
そしてそれをこのように解決しました:
// get the yoffset of the position where your View has to be placed
final int yoffset = < calculate the position of the view >
// position using top margin
if(myView.getLayoutParams() instanceof MarginLayoutParams) {
((MarginLayoutParams) myView.getLayoutParams()).topMargin = yOffset;
}
ただし、myView
の親レイアウトがRelativeLayout
のインスタンスであることを確認する必要があります。
より完全なコード:
// identify the button
final Button clickedButton = <... code to find the button here ...>
// inflate the dialog - the following style preserves xml layout params
final View floatingDialog =
this.getLayoutInflater().inflate(R.layout.floating_dialog,
this.floatingDialogContainer, false);
this.floatingDialogContainer.addView(floatingDialog);
// get the buttons position
final int[] buttonPos = new int[2];
clickedButton.getLocationOnScreen(buttonPos);
final int yOffset = buttonPos[1] + clickedButton.getHeight();
// position using top margin
if(floatingDialog.getLayoutParams() instanceof MarginLayoutParams) {
((MarginLayoutParams) floatingDialog.getLayoutParams()).topMargin = yOffset;
}
この方法でも、Javaコードでこれらのピクセル/ dpsをハードコーディングするのではなく、ターゲットXMLビューを使用して、レイアウトXMLファイルを使用して設定されたレイアウトパラメータに合わせて調整できます。
あなたの欲求に任意の見方を置くX&Yポイント
レイアウトファイル
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
tools:context="com.example.test.MainActivity" >
<AbsoluteLayout
Android:id="@+id/absolute"
Android:layout_width="match_parent"
Android:layout_height="match_parent" >
<RelativeLayout
Android:id="@+id/rlParent"
Android:layout_width="match_parent"
Android:layout_height="match_parent" >
<ImageView
Android:id="@+id/img"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@drawable/btn_blue_Matte" />
</RelativeLayout>
</AbsoluteLayout>
</RelativeLayout>
Javaクラス
public class MainActivity extends Activity {
private RelativeLayout rlParent;
private int width = 100, height = 150, x = 20, y= 50;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AbsoluteLayout.LayoutParams param = new AbsoluteLayout.LayoutParams(width, height, x, y);
rlParent = (RelativeLayout)findViewById(R.id.rlParent);
rlParent.setLayoutParams(param);
}
}
完了
万が一それが誰かを助けるかもしれない念のために、あなたはまた以下のようにこのアニメーター ViewPropertyAnimator を試すことができます
myView.animate().x(50f).y(100f);
myView.animate().translateX(pixelInScreen)
注:このピクセルはビューとは関係ありません。このピクセルは画面内のピクセル位置です。
へのクレジット bpr10答え