XML이 아닌 코드를 사용하여 ImageView의 여백을 설정하는 방법


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.MarginLayoutParams방법이 setMargins(left, top, right, bottom)있습니다. 직접 서브 클래스는 다음과 같습니다 FrameLayout.LayoutParams, LinearLayout.LayoutParams그리고 RelativeLayout.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);

여백 레이아웃 파라미터

여백을 픽셀 단위로 설정합니다. 확장하려면

context.getResources().getDisplayMetrics().density

디스플레이 메트릭스


18
이것은 PIXELS에서 여백 크기를 설정하며이 질문의 xml에서 dpi 단위와 동일하지 않습니다.
aromero

픽셀 대신 dpi 값을 어떻게 사용할 수 있습니까?
Pascal Piché

10
context.getResources (). getDisplayMetrics (). density 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
마지막 두 줄의 거래는 무엇입니까? 여백 매개 변수를 다른 매개 변수로 복제합니까? 나는 그것이 필요하다는 것을 확인할 수있다 :)
Adam

1
경우에 우리는 이미지 뷰의 아래쪽 여백 설정 싶어 android:layout_centerHorizontal = "true"하고 android:layout_alignParentBottom = "true"원하든 방법으로 나는이 작업을 수행 할 수 있습니까?
ssrp

layoutparams.addRule (RelativeLayout.CENTER_HORIZONTAL);
cwhsu 2014 년

다른 레이아웃 매개 변수를 작성해야합니다. 감사합니다 :)
무자

42

위의 모든 예는 실제로 것이다 교체 요구되지 않을 수 있습니다보기, 이미 존재하는 PARAMS을. 아래 코드는 기존 매개 변수를 바꾸지 않고 확장합니다.

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

1
이것은이 목록에서 나를 위해 일한 첫 번째 솔루션입니다. 다른 사람들은 포지셔닝을위한 RelativeLayout 매개 변수를 포함하여 XML에서 설정 한 다른 매개 변수를 망쳤습니다.
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 ()를 해결할 수 없습니다"라는 메시지를 얻었습니다.
user2875404

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로 여백을 설정하려면 values ​​/ 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
이 작동 leftright여백,하지만 당신은 상대적으로 마진 (있는 경우 startend)는 일을하지 않습니다. 나는 코드의 '개선 된'버전으로 요점을 썼습니다 : 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

이와 비슷한 방법을 사용하면 상황에 따라 두통을 덜 수 있습니다. 여백이있는 프로그래밍 방식의 땜질 패스가 두 번있는 경우 이미 일부 배치 매개 변수가 설정되어 있는지 확인하는 것이 더 안전합니다. 여백이 이미있는 경우 여백을 늘리고 바꾸지 않아야합니다.

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"
}

코드에서 간단하게 계산하십시오.

view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
   setMargins(5)
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.