回答:
はい、Androidでビューの位置を動的に設定できます。同様に、あなたが持っているImageView
中でLinearLayout
、あなたのxmlのはを通してあなたがその位置を設定することができfile.So LayoutParams
.Butを取ることを確認してくださいLayoutParams
あなたのxml file.Thereで撮影したレイアウトに応じて異なってLayoutParams
撮影したレイアウトに従って。
設定するコードは次のとおりです。
LayoutParams layoutParams=new LayoutParams(int width, int height);
layoutParams.setMargins(int left, int top, int right, int bottom);
imageView.setLayoutParams(layoutParams);
位置を決めるのに役立つと思います。
すでに有効な回答はいくつかありますが、対応するAPIレベルの制限を除いて、どの場合にどのメソッドを使用するかを適切に提案するものはありません。
レイアウトサイクルを待つことができ、親ビューグループがサポートMarginLayoutParams
(またはサブクラス)をサポートする場合は、それに応じてmarginLeft
/をmarginTop
設定します。
すぐに永続的に位置を変更する必要がある場合(たとえば、PopupMenuアンカーの場合)、さらにlayout(l, t, r, b)
同じ座標で呼び出します。これにより、レイアウトシステムが後で確認する内容が優先されます。
すぐに(一時的に)変更(アニメーションなど)を行うには、代わりにsetX()
/をsetY()
使用します。親のサイズがWRAP_CHILDRENに依存しない場合は、setX()
/をsetY()
排他的に使用することをお勧めします。
setLeft()
/ setRight()
/ setBottom()
/ setTop()
は使用しないでください。以下を参照してください。
背景:mLeft
/ mTop
/ mBottom
/ mRight
フィールドは、layout()の対応するLayoutParamsから入力されます。レイアウトは、Androidビューレイアウトシステムによって暗黙的および非同期的に呼び出されます。したがって、を設定MarginLayoutParams
することは、位置を永続的に設定するための最も安全でクリーンな方法のようです。ただし、非同期レイアウトの遅延は、たとえばビューを使用してカーソルをレンダリングする場合など、場合によっては問題になる可能性があり、再配置され、同時にPopupMenuアンカーとして機能することが想定されています。この場合、電話layout()
はうまくいきました。
setLeft()
およびの問題setTop()
は次のとおりです。
一人でそれらを呼び出すことは十分ではありません-あなたも呼び出す必要がありますsetRight()
し、setBottom()
ストレッチやビューを縮小避けるために。
これらのメソッドの実装は比較的複雑に見えます(=各メソッドによって引き起こされるビューサイズの変化を考慮するためにいくつかの作業を行っています)
それらは入力フィールドで奇妙な問題を引き起こすようです:EditTextソフト数字キーボードは時々数字を許可しません
setX()
そしてsetY()
作業レイアウトシステムの外側、及び対応する値は、それに応じてビューをシフトする、レイアウトシステムによって決定される左/上/下/右の値にオフセットを追加として扱われます。それらはアニメーション用に追加されたようです(レイアウトサイクルを経由しない即時の効果が必要な場合)。
marginLeft
設定するを使用setLayoutParams
してnew FrameLayout.LayoutParams(width, height)
で設定できることを指摘する価値がありますmarginLeft
NineOldAndroidsと呼ばれるライブラリがあり、Honeycombアニメーションライブラリをバージョン1まで使用できます。
これは、わずかに異なるインターフェースで、左、右、translationX / Yを定義できることを意味します。
以下にその仕組みを示します。
ViewHelper.setTranslationX(view, 50f);
ViewHelperクラスの静的メソッドを使用して、ビューと、ビューに設定する値を渡します。
HoneyComb Sdk(APIレベル11)を使用している場合は、次の方法を使用してみてください。
view.setX(float x);
パラメータxは、このビューの視覚的なx位置です。
view.setY(float y);
パラメータyは、このビューの視覚的なy位置です。
お役に立てれば幸いです。:)
このビューの左側の位置を、その親を基準にして設定します。
view.setLeft(int leftPosition);
親を基準にしてこのビューの正しい位置を設定します。
view.setRight(int rightPosition);
親を基準にしてこのビューの上部の位置を設定します。
view.setTop(int topPosition);
親を基準にしてこのビューの下部の位置を設定します。
view.setBottom(int bottomPositon);
上記のメソッドは、親に関連するビューの位置を設定するために使用されます。
LayoutParamsを使用します。LinearLayoutを使用している場合は、android.widget.LinearLayout.LayoutParamsをインポートする必要があります。それ以外の場合は、使用しているレイアウトの適切なバージョンのLayoutParamsをインポートする必要があります。そうしないと、ClassCastExceptionが発生します。
LayoutParams layoutParams = new LayoutParams(int width, int height);
layoutParams.setMargins(int left, int top, int right, int bottom);
imageView.setLayoutParams(layoutParams);
注意:imageView.setLeft(int dim)も使用できますが、これはコンポーネントの位置を設定するのではなく、コンポーネントの左の境界の位置のみを設定します。残りは同じ位置のままです。 。
@Stefan Hausteinが私の経験に非常に近いことがわかりましたが、100%確実ではありません。私の提案は:
setLeft()
/ setRight()
/ setBottom()
/ setTop()
時々動作しません。setX()
/setY()
代わりに。(あなたは違いでもっと検索したいかもしれませんsetLeft()
setX()
)配置について留意する必要があることの1つは、各ビューには親ビューを基準にしたインデックスがあることです。したがって、3つのサブビューを持つ線形レイアウトの場合、サブビューにはそれぞれインデックスがあります。上記の場合、0、1、2です。
これにより、次のようにして親ビューの最後の位置(または最後)にビューを追加できます。
int childCount = parent.getChildCount();
parentView.addView(newView, childCount);
または、次のようなものを使用してビューを置き換えることもできます。
int childIndex = parentView.indexOfChild(childView);
childView.setVisibility(View.GONE);
parentView.addView(newView, childIndex);
sets the top position of this view relative to its parent. This method is meant to be called by the layout system and should not generally be called otherwise, because the property may be changed at any time by the layout.
-たぶん、それはそれほど良い考えではありません;)