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

안드로이드 컴포즈 LocalDensity 🚀 가이드 🚀

by h4r3 2025. 2. 11.
반응형

 

📌 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나 터치 이벤트, 애니메이션 작업할 때 꼭 한 번 활용해 보세요!

반응형