Cách đặt lề của ImageView bằng mã, không phải xml


177

Tôi muốn thêm một số ImageViewlượt xem không xác định vào bố cục của mình với lề. Trong XML, tôi có thể sử dụng layout_marginnhư thế này:

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

ImageView.setPadding(), nhưng không ImageView.setMargin(). Tôi nghĩ rằng nó dọc theo dòng ImageView.setLayoutParams(LayoutParams), nhưng không chắc chắn những gì để ăn vào đó.

Có ai biết không?

Câu trả lời:


381

android.view.ViewGroup.MarginLayoutParamscó một phương pháp setMargins(left, top, right, bottom). Các lớp con trực tiếp là : FrameLayout.LayoutParams, LinearLayout.LayoutParamsRelativeLayout.LayoutParams.

Sử dụng ví dụ 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

Điều này đặt lề trong pixel. Để mở rộng quy mô sử dụng

context.getResources().getDisplayMetrics().density

DisplayMetrics


18
Lưu ý rằng điều này đặt kích thước lề trong PIXELS, không giống với đơn vị dpi trong xml của câu hỏi này.
aromero

Làm thế nào chúng ta có thể sử dụng một giá trị dpi thay vì pixel?
Pascal Piché

10
Bạn có thể chia tỷ lệ giá trị px bằng bối cảnh.getResource (). GetDisplayMetrics (). Mật độ developer.android.com/reference/android/util/ù
Khóa

1
Lưu ý rằng có thể có vấn đề với FrameLayout.LayoutParamsvà có thể với vấn đề khác: stackoverflow.com/questions/5401952/ mẹo
Dmitry Zaytsev

trong trường hợp chúng tôi chỉ muốn đặt lề dưới của chế độ xem hình ảnh android:layout_centerHorizontal = "true"android:layout_alignParentBottom = "true"theo cách nào tôi có thể thực hiện được điều này?
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
Thỏa thuận với 2 dòng cuối là gì? sao chép các thông số lề vào một biến params khác? Tôi có thể xác nhận nó là bắt buộc :)
Adam Rabung

1
trong trường hợp chúng tôi chỉ muốn đặt lề dưới của chế độ xem hình ảnh android:layout_centerHorizontal = "true"android:layout_alignParentBottom = "true"theo cách nào tôi có thể thực hiện được điều này?
ssrp

layoutparams.addRule (RelativeLayout.CENTER_HORIZONTAL);
cwhsu

Tạo một tham số bố trí khác là bắt buộc. Cảm ơn :)
Muzaffer

42

Tất cả các ví dụ trên sẽ thực sự thay thế bất kỳ thông số nào đã có cho Chế độ xem, có thể không mong muốn. Mã dưới đây sẽ chỉ mở rộng các thông số hiện có, mà không thay thế chúng:

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

1
Đây là giải pháp đầu tiên trong danh sách này phù hợp với tôi. Những cái khác làm hỏng các thông số khác mà tôi đã thiết lập trong XML, bao gồm các thông số RelativeLayout để định vị.
Chris Dutrow

22

Mã của Kevin tạo ra MarginLayoutParamsđối tượng dư thừa . Phiên bản đơn giản hơn:

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
Thật kỳ lạ, sau đó tôi nhận được "Không thể giải quyết phương thức setmargins ()", đó là lý do tại sao tôi googled cho câu hỏi này và hạ cánh ở đây.
dùng2875404

11

Nếu bạn muốn thay đổi lề xem hình ảnh nhưng vẫn giữ nguyên các lề khác.

  1. Nhận MarginLayoutParameter của chế độ xem hình ảnh của bạn trong trường hợp này: myImageView

     MarginLayoutParams marginParams = (MarginLayoutParams) myImageView.getLayoutParams();
  2. Bây giờ chỉ cần thay đổi lề bạn muốn thay đổi nhưng để nguyên những cái khác như sau:

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

8

Bạn có thể sử dụng phương pháp này, trong trường hợp bạn muốn chỉ định lề trong 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

Tôi sử dụng đơn giản điều này và hoạt động tuyệt vời:

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

Đơn vị của setMargins () là pixel không phải dp. Nếu bạn muốn đặt lề trong dp, ngay bên trong tệp giá trị / dimens.xml của bạn tạo các kích thước của bạn như:

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

và truy cập như:

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

5

Nếu bạn sử dụng kotlin, điều này có thể được đơn giản hóa bằng cách tạo chức năng mở rộng

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
}

Bây giờ tất cả những gì bạn cần là một khung nhìn và chức năng mở rộng này có thể được sử dụng ở bất cứ đâu.

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

1
cái này hoạt động cho leftrightlợi nhuận, nhưng nếu bạn có tỷ suất lợi nhuận tương đối ( startend) thì nó không hoạt động. Tôi đã viết một ý chính với phiên bản 'cải tiến' của mã của bạn: gist.github.com/Grohden/f40c53bf86c5395638f7a44bf90e732d ( setMarginsRelativechức năng) - bạn có thể đưa nó vào câu trả lời của mình không?
Gabriel De Oliveira Rohden 15/03/19

4

tạo bố cục động và đặt tham số của nó là setmargin () sẽ không hoạt động trực tiếp trên 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

Đối với tôi điều này đã làm việc:

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

mã mẫu ở đây, nó rất dễ dàng

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

Sử dụng một phương pháp tương tự như thế này có thể giúp bạn đỡ đau đầu trong một số tình huống. Nếu bạn có hai lần sửa đổi chương trình với lề, sẽ an toàn hơn nếu kiểm tra xem đã có một số layoutParams được đặt chưa. Nếu đã có một số lợi nhuận, người ta nên tăng chúng và không thay thế chúng:

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

Dưới đây là một ví dụ để thêm Marpx 8px ở bên trái, trên cùng, bên phải, dưới cùng.


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

Trả lời từ năm 2020:

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

và cal nó đơn giản trong mã của bạn

view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
   setMargins(5)
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.