Cara mengatur margin ImageView menggunakan kode, bukan xml


177

Saya ingin menambahkan jumlah ImageViewtampilan yang tidak diketahui ke tata letak saya dengan margin. Dalam XML, saya dapat menggunakan layout_marginseperti ini:

<ImageView android:layout_margin="5dip" android:src="@drawable/image" />

Ada ImageView.setPadding(), tapi tidak ImageView.setMargin(). Saya pikir itu sejalan ImageView.setLayoutParams(LayoutParams), tetapi tidak yakin apa yang harus dimasukkan ke dalam itu.

Apakah ada yang tahu?

Jawaban:


381

android.view.ViewGroup.MarginLayoutParamspunya metode setMargins(left, top, right, bottom). Subclass langsung adalah: FrameLayout.LayoutParams, LinearLayout.LayoutParamsdan RelativeLayout.LayoutParams.

Menggunakan mis LinearLayout:

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(left, top, right, bottom);
imageView.setLayoutParams(lp);

MarginLayoutParams

Ini mengatur margin dalam piksel. Untuk skala gunakan itu

context.getResources().getDisplayMetrics().density

DisplayMetrics


18
Perhatikan bahwa ini menetapkan ukuran margin dalam PIXELS, tidak sama dengan unit dpi dalam xml pertanyaan ini.
— aromero

Bagaimana kita bisa menggunakan nilai dpi bukannya pixel?
— Pascal Piché

10
Anda dapat skala nilai px menggunakan context.getResources (). GetDisplayMetrics (). Density developer.android.com/reference/android/util/…
— Key

1
Perhatikan, bahwa mungkin ada masalah dengan FrameLayout.LayoutParamsdan mungkin dengan yang lain: stackoverflow.com/questions/5401952/…
— Dmitry Zaytsev

seandainya kita ingin menetapkan hanya margin bawah dari tampilan gambar yang android:layout_centerHorizontal = "true"dan android:layout_alignParentBottom = "true"dengan cara apa saya bisa mencapai ini?
— ssrp

51
    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);

5
Apa masalahnya dengan 2 baris terakhir? mengkloning margin params ke dalam variabel params lain? Saya dapat mengonfirmasi bahwa itu wajib :)
— Adam Rabung

1
seandainya kita ingin menetapkan hanya margin bawah dari tampilan gambar yang android:layout_centerHorizontal = "true"dan android:layout_alignParentBottom = "true"dengan cara apa saya bisa mencapai ini?
— ssrp

layoutparams.addRule (RelativeLayout.CENTER_HORIZONTAL);
— cwhsu

Diperlukan penciptaan tata letak params lain. Terima kasih :)
— Muzaffer

42

Semua contoh di atas akan benar-benar MENGGANTI setiap parem yang sudah ada untuk Tampilan, yang mungkin tidak diinginkan. Kode di bawah ini hanya akan memperpanjang params yang ada, tanpa menggantinya:

ImageView myImage = (ImageView) findViewById(R.id.image_view);
MarginLayoutParams marginParams = (MarginLayoutParams) image.getLayoutParams();
marginParams.setMargins(left, top, right, bottom);

1
Ini adalah solusi pertama dalam daftar ini yang berhasil untuk saya. Yang lain mengacaukan params lain yang telah saya atur di XML, termasuk paratif RelativeLayout untuk penentuan posisi.
— Chris Dutrow

22

Kode Kevin menciptakan MarginLayoutParamsobjek yang berlebihan . Versi lebih sederhana:

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);

1
Cukup aneh saya kemudian mendapatkan "Tidak dapat menyelesaikan metode setmargins ()" itulah sebabnya saya googled untuk pertanyaan ini dan mendarat di sini.
— user2875404

11

Jika Anda ingin mengubah margin tampilan gambar tetapi biarkan semua margin lainnya tetap utuh.

  1. Dapatkan MarginLayoutParameters dari tampilan gambar Anda dalam hal ini: myImageView

     MarginLayoutParams marginParams = (MarginLayoutParams) myImageView.getLayoutParams();
  2. Sekarang ubah saja margin yang ingin Anda ubah tetapi biarkan yang lain apa adanya:

     marginParams.setMargins(marginParams.leftMargin, 
                             marginParams.topMargin, 
                             150, //notice only changing right margin
                             marginParams.bottomMargin); 

8

Anda dapat menggunakan metode ini, jika Anda ingin menentukan margin dalam 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);
}

8

Saya hanya menggunakan ini dan berfungsi dengan baik:

ImageView imageView = (ImageView) findViewById(R.id.image_id);
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) imageView.getLayoutParams();
layoutParams.setMargins(left, top, right, bottom);
imageView.setLayoutParams(layoutParams);

unit setMargins () adalah pixel bukan dp. Jika Anda ingin mengatur margin dalam dp, di dalam file nilai / dimens.xml Anda, buat dimensi Anda seperti:

<resources>
    <dimen name="right">16dp</dimen>
    <dimen name="left">16dp</dimen>    
</resources>

dan akses seperti:

getResources().getDimension(R.dimen.right);

5

Jika Anda menggunakan kotlin, ini dapat disederhanakan dengan membuat fungsi ekstensi

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
}

Sekarang yang Anda butuhkan hanyalah tampilan, dan fungsi ekstensi ini dapat digunakan di mana saja.

val imageView = findViewById(R.id.imageView)
imageView.setMarginExtensionFunction(0, 0, 0, 0)

1
ini berfungsi untuk leftdan rightmargin, tetapi jika Anda memiliki margin relatif ( startdan end) itu tidak berfungsi. Saya menulis intisari dengan versi kode Anda yang 'ditingkatkan': gist.github.com/Grohden/f40c53bf86c5395638f7a44bf90e732d ( setMarginsRelativefungsi) - dapatkah Anda memasukkannya dalam jawaban Anda?
— Gabriel De Oliveira Rohden

4

buat tata letak secara dinamis dan tetapkan parameternya sebagai setmargin () tidak akan berfungsi langsung pada 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)

4

Bagi saya ini berhasil:

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);

2

kode sampel ada di sini, sangat mudah

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);

0

Menggunakan metode yang mirip dengan ini mungkin menghemat beberapa sakit kepala dalam beberapa situasi. Jika Anda memiliki dua lintasan program yang mengutak-atik margin, lebih aman untuk memeriksa apakah sudah ada beberapa set layoutParams. Jika sudah ada margin, seseorang harus menambahnya dan tidak menggantinya:

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);
}

0

Berikut adalah contoh untuk menambahkan 8px Margin di kiri, atas, kanan, bawah.


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);

0

Jawaban dari tahun 2020:

dependencies {
    implementation "androidx.core:core-ktx:1.2.0"
}

dan kal hanya dalam kode Anda

view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
   setMargins(5)
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.