วิธีการตั้งระยะขอบของ ImageView โดยใช้รหัสไม่ใช่ xml


177

ฉันต้องการเพิ่มจำนวนการImageViewดูที่ไม่รู้จักลงในเลย์เอาต์ของฉันด้วยระยะขอบ ใน XML ฉันสามารถใช้layout_marginดังนี้:

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

มีแต่ไม่มีImageView.setPadding() ImageView.setMargin()ฉันคิดว่ามันเป็นไปตามแนวของImageView.setLayoutParams(LayoutParams)แต่ไม่แน่ใจว่าจะป้อนอะไรเข้าไป

มีใครรู้บ้าง

คำตอบ:


381

android.view.ViewGroup.MarginLayoutParamssetMargins(left, top, right, bottom)มีวิธีการ subclasses โดยตรง: FrameLayout.LayoutParams, และLinearLayout.LayoutParamsRelativeLayout.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);

MarginLayoutParams

สิ่งนี้จะกำหนดระยะขอบเป็นพิกเซล ในการไต่ระดับมันใช้

context.getResources().getDisplayMetrics().density

DisplayMetrics


18
โปรดทราบว่าการตั้งค่าขนาดขอบเป็น PIXELS นั้นไม่เหมือนกับหน่วย dpi ใน xml ของคำถามนี้
aromero

เราจะใช้ค่า dpi แทนพิกเซลได้อย่างไร
Pascal Piché

10
คุณสามารถปรับขนาดค่า px ได้โดยใช้ context.getResources (). getDisplayMetrics (). หนาแน่นdeveloper.android.com/reference/android/util/….
Key

1
โปรดทราบว่าอาจมีปัญหากับFrameLayout.LayoutParamsและอาจจะเป็นกับคนอื่น ๆ : stackoverflow.com/questions/5401952/…
Dmitry Zaytsev

ในกรณีที่เราต้องการตั้งค่าระยะขอบด้านล่างของมุมมองภาพที่เป็นandroid:layout_centerHorizontal = "true"และandroid:layout_alignParentBottom = "true"ในทางที่ฉันสามารถทำได้
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
ดีลคืออะไรกับ 2 บรรทัดสุดท้าย? โคลนมาร์จิ้นเป็นพารามิเตอร์ตัวแปรอื่นได้หรือไม่ ฉันสามารถยืนยันได้ว่าต้องการ :)
Adam Rabung

1
ในกรณีที่เราต้องการตั้งค่าระยะขอบด้านล่างของมุมมองภาพที่เป็นandroid:layout_centerHorizontal = "true"และandroid:layout_alignParentBottom = "true"ในทางที่ฉันสามารถทำได้
ssrp

layoutparams.addRule (RelativeLayout.CENTER_HORIZONTAL);
cwhsu

จำเป็นต้องสร้าง params เลย์เอาต์อื่น ขอบคุณ :)
Muzaffer

42

ตัวอย่างข้างต้นทั้งหมดจะแทนที่พารามิเตอร์ใด ๆ ที่มีอยู่แล้วสำหรับมุมมองซึ่งอาจไม่เป็นที่ต้องการ รหัสด้านล่างจะขยายขอบเขตที่มีอยู่เดิมโดยไม่ต้องแทนที่:

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

1
นี่เป็นทางออกแรกในรายการนี้ที่ใช้ได้กับฉัน ส่วนอื่น ๆ ทำให้ค่าพารามิเตอร์อื่น ๆ ที่ฉันตั้งไว้ใน XML รวมถึงพารามิเตอร์ RelativeLayout สำหรับการวางตำแหน่ง
Chris Dutrow

22

รหัสของ Kevin สร้าง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);

1
แปลกมากพอฉันได้ "ไม่สามารถแก้ไขเมธอด setmargins ()" ซึ่งเป็นสาเหตุที่ฉัน googled สำหรับคำถามนี้และลงจอดที่นี่
2875404

11

หากคุณต้องการเปลี่ยนระยะขอบของการรับชมภาพ แต่เว้นระยะขอบอื่น ๆ ทั้งหมดไว้

  1. รับ MarginLayoutParameters ของมุมมองภาพของคุณในกรณีนี้: myImageView

     MarginLayoutParams marginParams = (MarginLayoutParams) myImageView.getLayoutParams();
  2. ตอนนี้เพียงแค่เปลี่ยนระยะขอบที่คุณต้องการเปลี่ยน แต่ปล่อยให้ส่วนอื่น ๆ เป็น:

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

8

คุณสามารถใช้วิธีนี้ในกรณีที่คุณต้องการระบุระยะขอบใน 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

ฉันใช้เพียงแค่นี้และใช้งานได้ดี:

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 เพียงแค่อยู่ในไฟล์ค่า / dimens.xmlของคุณให้สร้างมิติของคุณดังนี้

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

และการเข้าถึงที่ชอบ:

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

5

หากคุณใช้ 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)

1
งานนี้สำหรับleftและrightอัตรากำไรขั้นต้น แต่ถ้าคุณมีอัตรากำไรขั้นต้นญาติ ( startและend) มันไม่ทำงาน ฉันเขียนส่วนหนึ่งที่มีรหัส 'รุ่นที่ปรับปรุง' ของคุณ: gist.github.com/Grohden/f40c53bf86c5395638f7a44bf90e732d ( setMarginsRelativeฟังก์ชั่น) - คุณรวมไว้ในคำตอบของคุณหรือไม่?
Gabriel De Oliveira Rohden

4

สร้างเลย์เอาต์แบบไดนามิกและตั้งค่าพารามิเตอร์เป็น 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)

4

สำหรับฉันแล้วสิ่งนี้ได้ผล:

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

โค้ดตัวอย่างอยู่ที่นี่มันง่ายมาก

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

การใช้วิธีการที่คล้ายกับสิ่งนี้อาจช่วยให้คุณปวดหัวในบางสถานการณ์ หากคุณมีการเขียนโปรแกรมแบบสองขั้นตอนโดยมีระยะขอบจะปลอดภัยกว่าเพื่อตรวจสอบว่ามีเค้าโครง 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);
}

0

นี่คือตัวอย่างการเพิ่มมาร์จิ้น 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);

0

คำตอบจากปี 2020:

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

และ cal เพียงในรหัสของคุณ

view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
   setMargins(5)
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.