안드로이드 개발 팁 #83 - 마진을 설정하는 View 클래스의 확장 함수 setMargin(left, top, right, bottom)

마진을 설정하는 View 클래스의 확장 함수 setMargin(left, top, right, bottom)

No. 83
2024. 09. 13 (금) | Written by @dorian-mobileapp

시작하며...

어느 뷰의 마진을 동적으로 설정하려고 했습니다. 그런데 뷰에 바로 설정이 가능하지 않구요. 그것의 LayoutParam 객체를 가져오고 그것의 마진을 설정해야 합니다. 이런 과정이 저는 번거롭다고 생각합니다. 그래서 뷰에서 마진을 바로 설정하기 위한 확장 함수를 구현했습니다.


마진을 설정하는 View 클래스의 확장 함수 setMargin(left, top, right, bottom)

확장 함수는 아래와 같이 정의하였습니다.

fun View.setMargins(leftDP: Int, topDP: Int, rightDP: Int, bottomDP: Int) {
    if (layoutParams !is ViewGroup.MarginLayoutParams) {
        return
    }

    (layoutParams as ViewGroup.MarginLayoutParams).setMargins(
        context.toPixelFromDP(leftDP.toFloat()).toInt(),
        context.toPixelFromDP(topDP.toFloat()).toInt(),
        context.toPixelFromDP(rightDP.toFloat()).toInt(),
        context.toPixelFromDP(bottomDP.toFloat()).toInt()
    )
}
파라메터
  • leftDP: Int
    • 좌측 마진의 길이 (단위: DP)
  • topDP: Int
    • 상측 마진의 길이 (단위: DP)
  • rightDP: Int
    • 우측 마진의 길이 (단위: DP)
  • bottomDP: Int
    • 하측 마진의 길이 (단위: DP)
DP에서 PX로 변환

이 확장 함수의 내부에서는 ViewGroup.MarginLayoutParams 객체의 setMargins(left, top, right, bottom) 함수를 호출하여 뷰의 마진을 설정합니다. 그런데 이 메소드의 파라메터들의 단위는 DP가 아닌 PX(픽셀)입니다. DP를 PX로 변환하는 과정이 필요합니다. 이것은 이미 Context.toPixelFromDP(dp) 확장 함수를 정의하였고, 그것을 활용하였습니다.

fun Context.toPixelFromDP(dp: Float): Float {
    return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, resources.displayMetrics)
}

추가로 setMargins 메소드의 파라메터들의 데이터형은 Int입니다. 이 때문에 Context.toPixelFromDP(dp)가 리턴한 Float 값을 Int로 강제 변환하였습니다.


지난 안드로이드 개발 팁


Layout provided by Steemit Enhancer hommage by ayogom


Posted through the ECblog app (https://blog.etain.club)
Sort:  

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Upvoted! Thank you for supporting witness @jswit.

Coin Marketplace

STEEM 0.09
TRX 0.32
JST 0.030
BTC 111530.32
ETH 3822.41
USDT 1.00
SBD 0.67