안드로이드 단위 (DP / DPI / PX)

박진성·2023년 4월 16일
0
post-custom-banner

DPI (Dot Per Inch)

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
  • default dpi (== 160)
val defultDPI = DisplayMetrics.DENSITY_DEFAULT

Density

  • pixel 의 밀도를 표시하는 단위

  • density = DPI / 160

  • density 구하는 법

val displayMetrics = context.resources.displayMetrics
val density = displayMetrics.density

DP(Density Independent Pixel)

  • 다양한 화면 크기를 지원하기 위해 만든 단위

  • 다양한 기기에서 동일하게 보여지게끔 해줌!!

  • DP = PX / Density

  • DP = PX * 160/DPI

PX

  • 절대적인 크기 단위

  • 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를 상태바까지 침범시켜야 했다.

상태바 높이 이슈

→ 처음

  • 상태바 높이를 pixel로 webview에 전달함
  • 생각보다 상태바가 너무 높게 설정됨;;
  • 생각해보니 어차피 웹뷰를 보는 내 화면은 안드로이드 인데, DP로 전달해야 되겠다는걸 깨닳음
  • 내화면의 상태바 높이 dp값 -> 웹에서 px값으로 적용 -> 내화면에서px값 그대로 보임

→ 해결

  • PX 값의 상태바 높이를 DP로 변환해서 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
}

Full Screen 적용하기

→ Themes 파일로 XML 적용시키는건, 최상단이 까맣게 빈공간 나타남.

  • running time 에서 kotlin 으로 적용시켜줘야함!!
window.apply {
    statusBarColor = Color.TRANSPARENT
    decorView.systemUiVisibility =
        View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
}
profile
Android Developer
post-custom-banner

0개의 댓글