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.