📌 LocalDensity가 뭔가요?
안드로이드 개발하다 보면 dp, sp, 그리고 px 같은 단위를 자주 만나죠? 이 단위들은 디바이스 해상도에 따라 크기가 다르게 표현되는데요. Jetpack Compose에서는 이 문제를 간단히 해결하기 위해 LocalDensity라는 아주 편리한 도구를 제공합니다!
💡 한마디로 정리하자면?
LocalDensity는 컴포즈 환경에서 dp → px, sp → px 변환을 손쉽게 도와주는 도구입니다.
화면 해상도나 폰트 크기가 제각각인 다양한 안드로이드 디바이스에서도 똑같은 UI를 유지하기 위해 반드시 필요하죠.
🔍 LocalDensity가 왜 중요한가요?
- 화면 해상도 대응: 다양한 디바이스에서도 일관된 UI 제공
- 픽셀 기반 레이아웃: Canvas나 Custom Drawing처럼 픽셀 단위가 필요한 곳에서 필수
- 폰트 크기 계산: 사용자 설정에 따른 폰트 크기 정확히 맞추기
📊 주요 메서드 & 속성 한눈에 보기
메서드 / 속성 설명
density | 현재 기기의 밀도 값 |
fontScale | 현재 폰트 스케일 비율 |
dp.toPx() | dp → px 변환 |
px.toDp() | px → dp 변환 |
sp.toPx() | sp → px 변환 |
px.toSp() | px → sp 변환 |
🔥 LocalDensity.current란?
LocalDensity.current는 Jetpack Compose에서 현재 컴포지션의 밀도 정보를 담고 있는 객체입니다.
✔ 쉽게 말해서?
기기의 화면 밀도와 폰트 스케일 정보를 바로 가져와 단위 변환에 사용할 수 있는 강력한 도구입니다.
아래처럼 with(LocalDensity.current) {} 블록 안에서 사용하면 아주 간편하답니다!
💻 실전 코드 예제
1. 기본 사용 예제 (dp → px 변환)
@Composable
fun PaddingExample() {
val paddingInDp = 16.dp
val paddingInPx = with(LocalDensity.current) { paddingInDp.toPx() }
Box(
modifier = Modifier
.size(100.dp)
.background(Color.Gray)
.padding(paddingInDp)
) {
Text(
text = "Padding in px: ${paddingInPx.roundToInt()}px",
color = Color.White
)
}
}
👉 핵심:
with(LocalDensity.current) 블록 안에서 dp.toPx()로 dp 값을 px로 변환했어요.
Canvas나 픽셀 기반 계산에 자주 사용되죠!
2. Canvas에서 동적 원 그리기 예제
@Composable
fun DynamicCircleExample() {
val circleSizeInDp = 50.dp
val circleSizeInPx = with(LocalDensity.current) { circleSizeInDp.toPx() }
Canvas(modifier = Modifier.size(circleSizeInDp * 2)) {
drawCircle(
color = Color.Blue,
radius = circleSizeInPx / 2
)
}
}
✅ 왜 이렇게 했을까?
Canvas는 픽셀 단위로 그리기 때문에 dp 값을 px로 변환하는 게 필수입니다.
3. 폰트 크기 변환 예제 (sp → px 변환)
@Composable
fun FontSizeExample() {
val textSizeInSp = 18.sp
val textSizeInPx = with(LocalDensity.current) { textSizeInSp.toPx() }
Text(
text = "Font size: ${textSizeInPx.roundToInt()}px",
fontSize = textSizeInSp
)
}
👍 꿀팁:
sp 단위는 사용자 폰트 설정에 따라 달라지기 때문에 toPx()로 변환하면 정확한 크기를 얻을 수 있어요.
🚀 언제 LocalDensity를 써야 할까?
- Canvas 및 Custom Drawing: 픽셀 단위 레이아웃 필요할 때
- 폰트 크기 계산: 사용자 폰트 설정 반영할 때
- 동적 레이아웃 크기 조정: 기기 밀도에 따라 레이아웃 크기를 계산할 때
- 애니메이션 및 터치 이벤트: 픽셀 기반 계산이 필요한 경우
✨ 마무리
Jetpack Compose에서는 더 이상 복잡하게 Resources.getDisplayMetrics() 같은 코드 안 써도 돼요. 그냥 LocalDensity.current 하나로 모든 밀도 변환을 끝낼 수 있답니다. 🎉
다음에 Canvas나 터치 이벤트, 애니메이션 작업할 때 꼭 한 번 활용해 보세요!