본문 바로가기
Kotlin

[Kotlin / Android] 09. 리소스 활용하기 - 폰 크기의 호환성

by 쀼르쀼르 2024. 3. 14.

09-3 폰 크기의 호환성


 

논리적인 단위 알아보기

 

안드로이드 시스템은 기기의 크기를 ldpi, mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi로 구분

여기서 dpidots per inch의 줄임말로 1인치 안에 있는 도트의 개수를 의미함

 

안드로이드 기기의 크기 구분

크기 설명
ldpi 저밀도 화면이며 ~120dpi
mdpi 중밀도 화면이며 ~160dpi
hdpi 고밀도 화면이며 ~240dpi
xhdpi 초고밀도 화면이며 ~320dpi
xxhdpi 초초고밀도 화면이며 ~480dpi
xxxhdpi 초초초고밀도 화면이며 ~640dpi

 

안드로이드 시스템은 기기의 크기를 구분하여

콘텐츠의 크기를 늘리거나 줄여서 그에 맞게 나올 수 있도록 도움

→  개발자가 콘텐츠의 크기를 지정할 때 논리적인 단위를 사용해야 함

     물리적인 단위로 지정하면 시스템의 도움을 받을 수 없음

 

안드로이드에서 앱 개발할 때 크기 지정에 사용할 수 있는 단위

  • dp(dip: density-independent pixels): 스크린의 물리적 밀도에 기반을 둔 단위
  • sp(sip: scale-independent pixels): dp와 유사하며 글꼴 크기에 적용
  • pt(points): 스크린 크기의 1/72을 1pt로 함
  • px: 픽셀
  • mm: 밀리미터
  • in: 인치

안드로이드에서는 논리적인 단위인 dp와 sp로 크기 지정을 권함

dp는 일반 크기, sp는 글꼴 크기를 의미함

 

· px와 dp 단위 크기 지정 예

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="HelloWorld"
    android:textSize="12px" />
    
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="HelloWorld"
    android:textSize="12dp" />

 

 실행 결과 

 

같은 크기를 지정했는데

단위를 px로 설정한 뷰는 문자열이 너무 작게 나와 제대로 보이지 않음

단위를 dp로 설정하면 시스템에서 기기의 dpi를 보고 크기를 조정하여 출력하므로

문자열이 px 단위를 사용할 때보다 크게 출력됨

 

크기별 배율

크기 배율
ldpi 0.75
mdpi 1.0
hdpi 1.5
xhdpi 2.0
xxhdpi 3.0
xxxhdpi 4.0

 


화면 정보 가져오기

 

개발자가 직접 코드에서 조정하려면

기기의 크기 정보를 가져와야 함

API 30 이전 버전에서는 DisplayMetrics로 크기 정보를 가져옴

API 30 버전부터는 (deprecation), WindowMetrics를 이용해야 함

 

· 기기의 가로, 세로 크기 가져오기

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    val windowMetrics: WindowMetrics = windowManager.currentWindowMetrics
    binding.textView.text = "width : ${windowMetrics.bounds.width()},
                            height : ${windowMetrics.bounds.height()}"
} else {
    val display = windowManager.defaultDisplay
    val displayMetrics = DisplayMetrics()
    display?.getRealMetrics(displayMetrics)
    binding.textView.text = "width : ${displayMetrics.widthPixels},
                            height : ${displayMetrics.heightPixels}"
}

 

 실행 결과 

 

Build.VERSION.SDK_INT는 앱이 실행되는 기기의 버전값이며

Build.VERSION_CODES.R은 안드로이드11버전, 즉 API레벨 30을 의미함