Android 디바이스 크기의 호환성

timothy jeong·2021년 11월 3일
0

Android with Kotlin

목록 보기
13/69

안드로이드 디바이스는 다양한 크기로 출시된다. 그러므로 안드로이드 앱 개발자는 다양한 기기와 호한되는 화면을 만드는 것이 중요한 과제이다. 이러한 디바이스 크기에 따른 호환성은 안드로이드 시스템 자체에서 도와주는 부분이 있고, 개발자가 직접 코드에서 해결해야 하는 부분이 있다.

논리적인 단위

우선 안드로이드 시스템에서는 기기의 크기를 어떻게 판단하는지 보자. 안드로이드 시스템은 기기의 크기를 아래의 표와 같이 구분한다. 이때 언급되는 dpi 는 Dots per Inch 의 약자로, 1인치당 점이 몇개 들어가는지, 즉 해상도의 개념이다. 디바이스의 크기가 dpi 가 적은 이미지는 깨져보일 것이고, dpi 가 많은 이미지는 제대로 보일 것이다.

dpi 는 화면 크기에 대한 직접적인 단위가 아니므로, dpi 가 크다고 무조건 크기가 큰 디바이스는 아니다.

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

안드로이드 시스템은 위 표처럼 기기의 크기를 구분하여 콘텐츠의 크기를 늘리거나 줄여서 그에 맞게 나올 수 있도록 돕는다. 그런데 이 도움을 받으려면 개발자가 콘텐츠의 크기를 지정할때 비슷한 논리의 단위를 사용해야 한다. px 을 이용하면 시스템의 도움을 받을 수 없다.

우리가 흔히 사용해왔던 dp(dip : density-independent pixels)는 스크린의 물리적 밀도(dpi)에 기반을 둔 단위이다. 따라서 dp 를 쓰는 것이 권장되고, 텍스트의 경우에는 sp(sip : scale-independent pixels) 를 쓰는 것이 권장된다.

dpi 에 따라 dp 가 어떻게 변하는지는 아래의 표에 정리되어 있다. 코드상 10dp 로 크기를 지정했다면 xxxhdpi 에서는 40px 의 크기처럼 보이게 되는 것이다.

크기 단위dp 배율
ldpi0.75
mdpi1.0
hdpi1.5
xhdpi2.0
xxhdpi3.0
xxxhdpi4.0

화면 정보 가져오기

안드로이드 시스템 상에서 크기 호환성에 도움을 주지만, 때로는 개발자가 직접 코드에서 조정해야 할 수도 있다. 이때 이용하는 클래스가 DisplayMetrics 클래스이다.

DisplayMetrics 클래스는 아래와 같은 기기 크기 정보를 제공하낟.

  • widtPixels : 가로 화소 수
  • heightPixels : 세로 화소 수
  • densityDpi : 화면 밀도
  • xdpi : 정확한 가로 밀도
  • ydpi : 정확한 세로 밀도
  • density : mdpi를 기준으로 한 배율. 스케일링 할 때 곱하는 값
  • scaleDensity : 문자열 스케일링할 때 곱하는 값
        val metrics: DisplayMetrics = resources.displayMetrics
        val px = 10
        val dp = px * metrics.density

        binding.TextView.append("""
            widtPixels : ${metrics.widthPixels}
            heightPixels : ${metrics.heightPixels}
            densityDpi : ${metrics.densityDpi}
            xdpi : ${metrics.xdpi}
            ydpi : ${metrics.ydpi}
            density : ${metrics.density}
            scaleDensity : ${metrics.scaledDensity}
            px($px) -> dp($dp)  
        """) 
profile
개발자

0개의 댓글