반응형
📌 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
반응형