1인치에 들어가는 px 의 갯수를 뜻함
ex) 160dpi = 1인치 당 픽셀이 160개
→ 크게 총 6가지가 있다
ldpi : 120dpi
mdpi : 160dpi (default)
hdpi : 240dpi
xhdpi : 320dpi
xxhdpi : 480dpi
xxxhdpi : 640dpi
dpi 구하는법
val displayMetrics = context.resources.displayMetrics
val dpi = displayMetrics.densityDpi
val defultDPI = DisplayMetrics.DENSITY_DEFAULT
pixel 의 밀도를 표시하는 단위
density = DPI / 160
density 구하는 법
val displayMetrics = context.resources.displayMetrics
val density = displayMetrics.density
다양한 화면 크기를 지원하기 위해 만든 단위
다양한 기기에서 동일하게 보여지게끔 해줌!!
DP = PX / Density
DP = PX * 160/DPI
절대적인 크기 단위
PX = DP * Density
PX = DP * DPI/160
→ 상태바, 네비게이션 바 제외 화면의 가로 세로 pixel 값 가져오기
val display = context.resources?.displayMetrics
val deviceWidth = display?.widthPixels
val deviceHeight = display?.heightPixels
→ 상태바 높이 가져오기 (pixel)
fun getStatusBarHeight(context: Context){
var statusbarHeight = 0
val resourceId: Int = context.resources.getIdentifier("status_bar_height", "dimen", "android")
if (resourceId > 0) {
statusbarHeight = context.resources.getDimensionPixelSize(resourceId)
}
}
→ 네비게이션바 높이 가져오기 (pixel)
fun getnavigationBarHeight(context: Context){
val resourceId = context.resources.getIdentifier("navigation_bar_height", "dimen", "android")
var navigationbarHeight = 0
if (resourceId > 0) {
navigationbarHeight = context.resources.getDimensionPixelSize(resourceId)
}
}
안드로이드 네이티브에 webview를 띄우는 앱에서,
전체화면을 적용시켜 webview를 상태바까지 침범시켜야 했다.
→ 처음
→ 해결
fun getStatusBarHeight(context: Context): Int {
var statusbarHeight = 0
val resourceId: Int = context.resources.getIdentifier("status_bar_height", "dimen", "android")
if (resourceId > 0) {
statusbarHeight = context.resources.getDimensionPixelSize(resourceId)
}
var statusbarHeightDP = pxTodp(statusbarHeight, context)
return statusbarHeightDP.toInt()
}
fun pxTodp(px: Int, context: Context): Float {
return px / context.resources.displayMetrics.density
}
→ Themes 파일로 XML 적용시키는건, 최상단이 까맣게 빈공간 나타남.
window.apply {
statusBarColor = Color.TRANSPARENT
decorView.systemUiVisibility =
View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
}