단말에 따라 해상도는 다를 수 있기 때문에 화면의 크기를 가져와야 하는 경우가 꽤 있습니다.
최근 화면 크기 관련하여 더 이상 지원하지 않는 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: