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?

Bruce Lee
sumber

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

Kunci
sumber
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);
Kevin Wadera
sumber
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);
Kelevando
sumber
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);
Adam Stelmaszczyk
sumber
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); 
CommonSenseCode
sumber
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);
}
Divona
sumber
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);
Elnoor
sumber
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)
enyciaa
sumber
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)
Muhammad Adil
sumber
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);
Wahib Ul Haq
sumber
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);
Sydroid
sumber
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);
}
GA1
sumber
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);
Md. Zubaer Ahammed
sumber
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)
}
i30mb1
sumber