본문 바로가기
카테고리 없음

🚀 displayMetrics 없이 변환하면 어떻게 될까?

by h4r3 2025. 2. 21.
반응형

 

 

📌 displayMetrics 없이 변환하면 생기는 문제점

안드로이드에서 context.resources.displayMetrics를 사용하지 않으면 픽셀(px) 값을 그대로 사용하게 됩니다.
이 경우, 고해상도 디바이스에서는 UI 요소가 작아 보이고, 저해상도 디바이스에서는 지나치게 커 보이는 문제가 발생할 수 있습니다.

핵심 요점:

  • 안드로이드는 디스플레이 밀도(Density)에 맞춰 UI를 자동 조정하지만, displayMetrics를 사용하지 않으면 이 기능을 활용할 수 없음
  • px 값을 dp로 변환할 때 밀도 정보를 고려하지 않으면 기기마다 UI 크기가 다르게 보임

📌 displayMetrics를 사용해야 하는 이유

안드로이드 UI는 밀도 독립적 단위(dp, dip) 를 사용하여 화면 크기에 관계없이 일관된 UI 비율을 유지하려고 합니다.
따라서 픽셀(px) 값을 dp로 변환할 때 반드시 밀도 정보를 적용해야 합니다.

밀도(Density)별 차이점

디바이스  스크린 해상도 밀도값 1dp당 px 크기
LDPI 240x320 0.75 1dp = 0.75px
MDPI 320x480 1.0 1dp = 1px
HDPI 480x800 1.5 1dp = 1.5px
XHDPI 720x1280 2.0 1dp = 2px
XXHDPI 1080x1920 3.0 1dp = 3px

💡 예제: TypedValue.complexToDimensionPixelSize()가 96px을 반환한 경우

  • MDPI (density = 1.0) → 96px = 96dp
  • XXHDPI (density = 3.0) → 96px / 3 = 32dp

📌 밀도를 고려하지 않으면 고해상도 기기에서 UI 요소가 너무 작거나 클 수 있음!


📌 displayMetrics 없이 변환하면 생기는 문제

만약 px 값을 dp로 변환할 때 밀도를 고려하지 않으면, 픽셀 단위로 UI가 적용되면서 화면 크기가 제각각이 됩니다.

val pixelValue = TypedValue.complexToDimensionPixelSize(typedValue.data, context.resources.displayMetrics)
val incorrectDp = pixelValue.dp // ❌ 밀도 정보 없이 그대로 dp 변환

🚨 문제점:

  • XXHDPI (density = 3.0) 디바이스에서 96px을 그대로 96dp로 해석하면 → 실제 크기가 3배 커짐
  • 결과: 고해상도 디바이스에서 UI가 너무 크게 보이는 문제 발생

올바른 해결 방법

val correctDp = (pixelValue / context.resources.displayMetrics.density).dp
  • XXHDPI (density = 3.0) → 96px / 3 = 32dp
  • MDPI (density = 1.0) → 96px / 1 = 96dp

💡 이렇게 하면 모든 기기에서 동일한 UI 크기를 유지할 수 있음! 🚀


📌 displayMetrics 적용한 올바른 코드 예제

@Composable
fun getThemeDimension(attr: Int, defaultValue: Float = 0f): Dp {
    val context = LocalContext.current
    val typedValue = TypedValue()
    return if (context.theme.resolveAttribute(attr, typedValue, true)) {
        val pxValue = TypedValue.complexToDimensionPixelSize(typedValue.data, context.resources.displayMetrics)
        (pxValue / context.resources.displayMetrics.density).dp // ✅ 밀도 적용 변환
    } else {
        defaultValue.dp
    }
}

📌 정리: displayMetrics를 꼭 사용해야 하는 이유

변환방식 문제점
px을 그대로 dp로 변환 고해상도 디바이스에서 UI 요소가 너무 커짐
밀도(displayMetrics.density) 적용 모든 기기에서 같은 크기로 표시됨

💡 결론:
항상 displayMetrics.density를 적용하여 변환해야 모든 디바이스에서 UI 크기를 동일하게 유지할 수 있음! 🚀

🔍 더 많은 안드로이드 개발 꿀팁을 알고 싶다면? https://h4r3.tistory.com

반응형