回答:
android.view.ViewGroup.MarginLayoutParams
メソッドがありsetMargins(left, top, right, bottom)
ます。直接のサブクラスは以下の通りですFrameLayout.LayoutParams
、LinearLayout.LayoutParams
とRelativeLayout.LayoutParams
。
例えば LinearLayout
:
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(left, top, right, bottom);
imageView.setLayoutParams(lp);
これはマージンをピクセルで設定します。スケールするには
context.getResources().getDisplayMetrics().density
FrameLayout.LayoutParams
:そしておそらく他とstackoverflow.com/questions/5401952/...
android:layout_centerHorizontal = "true"
、どのandroid:layout_alignParentBottom = "true"
ようにすればこれを達成できますか?
image = (ImageView) findViewById(R.id.imageID);
MarginLayoutParams marginParams = new MarginLayoutParams(image.getLayoutParams());
marginParams.setMargins(left_margin, top_margin, right_margin, bottom_margin);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(marginParams);
image.setLayoutParams(layoutParams);
android:layout_centerHorizontal = "true"
、どのandroid:layout_alignParentBottom = "true"
ようにすればこれを達成できますか?
上記の例はすべて、ビューにすでに存在するパラメーターを実際に置き換えますが、これは望ましくない場合があります。以下のコードは、既存のパラメーターを拡張せず、それらを置き換えません。
ImageView myImage = (ImageView) findViewById(R.id.image_view);
MarginLayoutParams marginParams = (MarginLayoutParams) image.getLayoutParams();
marginParams.setMargins(left, top, right, bottom);
ケビンのコードは冗長MarginLayoutParams
オブジェクトを作成します。シンプルなバージョン:
ImageView image = (ImageView) findViewById(R.id.main_image);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(image.getLayoutParams());
lp.setMargins(50, 100, 0, 0);
image.setLayoutParams(lp);
画像ビューのマージンを変更したいが、他のすべてのマージンはそのままにしたい場合。
この場合、画像ビューのMarginLayoutParametersを取得します。 myImageView
MarginLayoutParams marginParams = (MarginLayoutParams) myImageView.getLayoutParams();
変更したいマージンを変更するだけで、他はそのままにします。
marginParams.setMargins(marginParams.leftMargin,
marginParams.topMargin,
150, //notice only changing right margin
marginParams.bottomMargin);
dpでマージンを指定する場合は、このメソッドを使用できます。
private void addMarginsInDp(View view, int leftInDp, int topInDp, int rightInDp, int bottomInDp) {
DisplayMetrics dm = view.getResources().getDisplayMetrics();
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.setMargins(convertDpToPx(leftInDp, dm), convertDpToPx(topInDp, dm), convertDpToPx(rightInDp, dm), convertDpToPx(bottomInDp, dm));
view.setLayoutParams(lp);
}
private int convertDpToPx(int dp, DisplayMetrics displayMetrics) {
float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, displayMetrics);
return Math.round(pixels);
}
私はこれを単純に使用してうまくいきます:
ImageView imageView = (ImageView) findViewById(R.id.image_id);
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) imageView.getLayoutParams();
layoutParams.setMargins(left, top, right, bottom);
imageView.setLayoutParams(layoutParams);
setMargins()の単位はdpではなくピクセルです。dpでマージンを設定する場合は、values / dimens.xmlファイルの中に次のようなディメンションを作成します。
<resources>
<dimen name="right">16dp</dimen>
<dimen name="left">16dp</dimen>
</resources>
のようなアクセス:
getResources().getDimension(R.dimen.right);
kotlinを使用する場合、拡張関数を作成することでこれを簡略化できます
fun View.setMarginExtensionFunction(left: Int, top: Int, right: Int, bottom: Int) {
val params = layoutParams as ViewGroup.MarginLayoutParams
params.setMargins(left, top, right, bottom)
layoutParams = params
}
これで必要なのはビューだけであり、この拡張関数はどこでも使用できます。
val imageView = findViewById(R.id.imageView)
imageView.setMarginExtensionFunction(0, 0, 0, 0)
left
とのright
マージンで機能しますが、相対的なマージン(start
およびend
)がある場合は機能しません。私はあなたのコードの「改良された」バージョンで要旨を書きました:gist.github.com/Grohden/f40c53bf86c5395638f7a44bf90e732d(setMarginsRelative
関数)-あなたの答えにそれを含めることができますか?
レイアウトを動的に作成し、setmargin()がimageViewで直接機能しないため、そのパラメーターを設定します
ImageView im;
im = (ImageView) findViewById(R.id.your_image_in_XML_by_id);
RelativeLayout.LayoutParams layout = new RelativeLayout.LayoutParams(im.getLayoutParams());
layout.setMargins(counter*27, 0, 0, 0);//left,right,top,bottom
im.setLayoutParams(layout);
im.setImageResource(R.drawable.yourimage)
私にとってこれはうまくいきました:
int imgCarMarginRightPx = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, definedValueInDp, res.getDisplayMetrics());
MarginLayoutParams lp = (MarginLayoutParams) imgCar.getLayoutParams();
lp.setMargins(0,0,imgCarMarginRightPx,0);
imgCar.setLayoutParams(lp);
サンプルコードはここにあり、それは非常に簡単です
LayoutParams params1 = (LayoutParams)twoLetter.getLayoutParams();//twoletter-imageview
params1.height = 70;
params1.setMargins(0, 210, 0, 0);//top margin -210 here
twoLetter.setLayoutParams(params1);//setting layout params
twoLetter.setImageResource(R.drawable.oo);
このような方法を使用すると、状況によっては頭痛の種を減らすことができます。マージンを使用したプログラムによるいじりの2つのパスがある場合は、layoutParamsセットがすでにあるかどうかを確認する方が安全です。マージンがすでにある場合は、マージンを増やして置き換えないでください。
public void addMargins(View v, int left, int top, int right, int bottom) {
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) v.getLayoutParams();
if (params == null)
params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
int oldLeft = params.leftMargin;
int oldTop = params.topMargin;
int oldRight = params.rightMargin;
int oldBottom = params.bottomMargin;
params.setMargins(oldLeft + left, oldTop + top, oldRight + right, oldBottom + bottom);
v.setLayoutParams(params);
}
以下は、左、上、右、下に8pxのマージンを追加する例です。
ImageView imageView = new ImageView(getApplicationContext());
ViewGroup.MarginLayoutParams marginLayoutParams = new ViewGroup.MarginLayoutParams(
ViewGroup.MarginLayoutParams.MATCH_PARENT,
ViewGroup.MarginLayoutParams.WRAP_CONTENT
);
marginLayoutParams.setMargins(8, 8, 8, 8);
imageView.setLayoutParams(marginLayoutParams);