사실 진짜 기본적인건데(ㅎㅎ) 한 n개월 지나면 또 딴 블로그 가서 찾고 있는 나를 보며 스스로 한심한 표정을 하면서 기록한다.
1. display 크기 구하기
검색하면 자주 보이는 windowManager.defaultDisplay 의 경우 api 30에서 deprecate가 되었다. 따라서, 버전 별로 나누어 두 가지 방식을 만들었다.
(저는 함수에서 width만 구하기 위해 point.x만 썼는데, 높이가 필요하면 point.y로 하시면 됩니다.)
private fun initWidth() {
if (Build.VERSION.SDK_INT >= 30) {
var display = requireContext().display
var size = Point()
display?.getRealSize(size)
width = size.x.toDouble() / 2.0
ILog.iLogDebug(TAG, width)
} else {
var display = requireActivity().windowManager.defaultDisplay
var size = Point()
display?.getRealSize(size)
width = size.x.toDouble() / 2.0
ILog.iLogDebug(TAG, width)
}
}
저는 이 코드를 다양하게 쓰는데, 지도의 축적 구하기, 레이아웃 크기 동적으로 구하기 등등..
근데 제일 많이 쓰는건 레이아웃의 크기를 동적으로 변환하는데에 자주 이용합니다.
2. 레이아웃 크기 동적으로 변환하기
인터넷에 돌아다니는 것 중 제일 많이 보이는게 Linearlayout.layoutParam인데, 이렇게 되면 프래그먼트 등등의 다양한 상황에서 이용할 수 없는 단점이 있습니다. 그래서, Linearlayout.layoutParam보다 좀 더 다양한 범용성으로 사용할 수 있는 ViewGroup.layoutParam을 이용했습니다.
(저는 이 코드를 네이버 맵 팝업(fragment)의 맵 크기 동적 변환에 사용했읍니다. 원하시는 viewgroup에 다 응용 가능합니다.)
private fun setImageViewHeight(fragment: Fragment) {
val width: Int = DisplayUtil.getScreenWidthPx(context)
var params: ViewGroup.LayoutParams? = fragment.view?.layoutParams
params?.width = width
params?.height = width
fragment.view?.layoutParams = params
}
이 코드를 이용하면 정사각형의 뷰그룹을 만들 수 있습니다. param.width나 param.height에 다양한 값을 넣으면 그 크기대로 동적으로 변환됩니다. 이벤트 호출 시 마다 동적으로 변경을 하고 싶다면, 길이 값을 전역변수로 설정해놓고, 호출 전 전역변수를 변경하고 이벤트 호출 시 함수를 호출하던가, 매개변수로 width와 height를 받아 이벤트 호출 시 마다 원하는 값을 삽입해서 호출하면 되겠죠.