단말에 따라 해상도는 다를 수 있기 때문에 화면의 크기를 가져와야 하는 경우가 꽤 있습니다. 최근 화면 크기 관련하여 더 이상 지원하지 않는 method 에 대해 알아보면서 (조금 귀찮기는 하지만..) 정리해서 기록에 남겨놓으면 좋겠다 해서 쓰게되었어...

[안드로이드] Android 11 대응, 화면 크기 구하기 (+상태바, 네비게이션바)

단말에 따라 해상도는 다를 수 있기 때문에 화면의 크기를 가져와야 하는 경우가 꽤 있습니다.

최근 화면 크기 관련하여 더 이상 지원하지 않는 method 에 대해 알아보면서

(조금 귀찮기는 하지만..) 정리해서 기록에 남겨놓으면 좋겠다 해서 쓰게되었어요 ㅎㅎ




 

 

1. 목표

 - 화면 너비 ,높이 구하기

 - 화면 상태 바(Status Bar), 네비게이션 바 (Navigation Bar) 높이 구하기

 - 화면 크기 관련 Android 11 (API level 30)  이상 대응 : Use currentWindowMetrics

 

 

 


2. 화면 크기 - (1)

System UI (상태 바, 네비게이션 바) 가 포함된 화면 크기를 가져올 수 있는 메서드 입니다.

@Suppress("DEPRECATION")
// 'getDefaultDisplay()' was deprecated in API level 30.
// 'getRealMetrics()' was deprecated in API level 31.
fun getScreenRealWidth(context: Context): Int {
val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
val windowMetrics = windowManager.currentWindowMetrics
windowMetrics.bounds.width()
} else {
val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay.getRealMetrics(displayMetrics)
displayMetrics.widthPixels
}
}

@Suppress("DEPRECATION")
// 'getDefaultDisplay()' was deprecated in API level 30.
// 'getRealMetrics()' was deprecated in API level 31.
fun getScreenRealHeight(context: Context): Int {
val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
val windowMetrics = windowManager.currentWindowMetrics
windowMetrics.bounds.height()
} else {
val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay.getRealMetrics(displayMetrics)
displayMetrics.heightPixels
}
}


 

 

 

 

3. 화면 크기 - (2)

System UI (상태 바, 네비게이션 바) 가 포함되지 않은 화면 크기를 가져올 수 있는 메서드 입니다.

@Suppress("DEPRECATION")
// 'getDefaultDisplay()' was deprecated in API level 30.
// 'getRealMetrics()' was deprecated in API level 31.
fun getScreenWidth(context: Context): Int {
val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
val windowMetrics = windowManager.currentWindowMetrics
val insets = windowMetrics.windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.systemBars())
windowMetrics.bounds.width() - insets.left - insets.right
} else {
val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay.getRealMetrics(displayMetrics)
displayMetrics.widthPixels
}
}

@Suppress("DEPRECATION")
// 'getDefaultDisplay()' was deprecated in API level 30.
// 'getRealMetrics()' was deprecated in API level 31.
fun getScreenHeight(context: Context): Int {
val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
val windowMetrics = windowManager.currentWindowMetrics
val insets = windowMetrics.windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.systemBars())
windowMetrics.bounds.height() - insets.bottom - insets.top
} else {
val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay.getRealMetrics(displayMetrics)
displayMetrics.heightPixels - getStatusBarSize(context) - getNavigationBarSize(context)
}
}

 

 

 

 

4. 상태 바(Status Bar) 높이

상태 바(Status Bar) 높이를 구하는 메서드입니다.

fun getStatusBarSize(context: Context): Int {
var statusBarHeight = 0
val resourceId = context.resources.getIdentifier("status_bar_height", "dimen", "android")
if (resourceId > 0) statusBarHeight = context.resources.getDimensionPixelSize(resourceId)

return statusBarHeight
}

 

 


 

5. 네비게이션 바(Navigation Bar) 높이

네비게이션 바(Navigation Bar) 높이를 구하는 메서드입니다.

fun getNavigationBarSize(context: Context): Int {
var navigationBarHeight = 0
val resourceId = context.resources.getIdentifier("navigation_bar_height", "dimen", "android")
if (resourceId > 0) navigationBarHeight = context.resources.getDimensionPixelSize(resourceId)

return navigationBarHeight
}

 

 

 

 

6. 테스트 결과

갤럭시 S21+ 에서 테스트를 진행하였습니다.

해당 스마트폰의 해상도는 2400 x 1080 을 가집니다.

 

 

결과는 아래와 같습니다.






7. getMetrics 를 쓰지 않은 이유

getMetrics 를 활용해서 화면 높이를 가져오는 경우 스마트폰에 따라 상태 바(Status Bar) 높이가

포함되기도 하고 포함되지 않는 경우가 있기 때문에 getRealMetrics 만 사용하였습니다.





[Reference]

'getDefaultDisplay' was deprecated  >> 문서 바로가기

 

'getMetrics' was deprecated >> 문서 바로가기

 

'getRealMetrics' was deprecated >> 문서 바로가기

0 comments: