programing

xml이 아닌 코드를 사용하여 ImageView 마진을 설정하는 방법

itmemos 2023. 9. 4. 19:35
반응형

xml이 아닌 코드를 사용하여 ImageView 마진을 설정하는 방법

알 수 없는 수를 추가합니다.ImageView여백이 있는 내 레이아웃에 대한 뷰.XML에서, 나는 사용할 수 있습니다.layout_margin다음과 같이:

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

있어ImageView.setPadding()하지만 아닙니다ImageView.setMargin()저는 그것이 다음과 같다고 생각합니다.ImageView.setLayoutParams(LayoutParams)하지만 그것에 무엇을 넣어야 할지 잘 모르겠습니다.

아는 사람이 있나요?

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

메트릭 표시

    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);

위의 모든 예제는 실제로 보기에 이미 존재하는 모든 매개변수를 대체합니다. 이 매개변수는 필요하지 않을 수 있습니다.아래 코드는 기존 매개변수를 대체하지 않고 기존 매개변수만 확장합니다.

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

케빈의 코드는 중복을 만듭니다.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. 이 경우 이미지 보기의 여백 레이아웃 매개 변수를 가져옵니다.myImageView

     MarginLayoutParams marginParams = (MarginLayoutParams) myImageView.getLayoutParams();
    
  2. 이제 변경할 마진만 변경하고 나머지 마진은 그대로 유지합니다.

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

2020년부터 답변:

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

코드로 간단히 계산합니다.

view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
   setMargins(5)
}

저는 이것을 간단하게 사용하고 아주 잘 작동합니다.

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);

코틀린을 사용하는 경우 확장 함수를 만들어 단순화할 수 있습니다.

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)

여백을 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);
}

레이아웃을 동적으로 만들고 매개 변수를 setmargin()으로 설정하면 이미지에서 직접 작동하지 않습니다.보기

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)

제게는 효과가 있었습니다.

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);

샘플 코드는 여기 있습니다, 그것은 매우 쉽습니다.

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);

코틀린에서 당신은 그것을 더 기분 좋은 방법으로 쓸 수 있습니다.

myView.layoutParams = LinearLayout.LayoutParams(
                RadioGroup.LayoutParams.MATCH_PARENT, RadioGroup.LayoutParams.WRAP_CONTENT
            ).apply {
                setMargins(12, 12, 12, 12)
            }

다음은 왼쪽, 위, 오른쪽, 아래에 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);

이와 유사한 방법을 사용하면 경우에 따라 두통을 줄일 수 있습니다.여백이 있는 프로그램 조정의 패스가 두 개 있는 경우 이미 일부 레이아웃Params가 설정되어 있는지 확인하는 것이 더 안전합니다.이미 일부 여유가 있는 경우에는 여유를 늘리지 않고 대체해야 합니다.

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);
}

선형 레이아웃 매개 변수를 만들고 dp 값에 resource.getDimensionPixelSize를 사용할 수 있습니다.

    val mContext = parent.context
    val mImageView = AppCompatImageView(mContext)
    mImageView.setBackgroundResource(R.drawable.payment_method_selector)

    val height = mContext.resources.getDimensionPixelSize(R.dimen.payment_logo_height)
    val width = mContext.resources.getDimensionPixelSize(R.dimen.payment_logo_width)
    val padding = mContext.resources.getDimensionPixelSize(R.dimen.spacing_small_tiny)
    val margin = mContext.resources.getDimensionPixelSize(R.dimen.spacing_small)

    mImageView.layoutParams = LinearLayout.LayoutParams(width, height).apply {
        setMargins(margin, margin, 0, 0)
    }
    mImageView.setPadding(padding, padding, padding, padding)

언급URL : https://stackoverflow.com/questions/3416087/how-to-set-margin-of-imageview-using-code-not-xml

반응형