Android2012. 1. 11. 10:51

[Screen size]
단말기 스크린의 대각선을 측정한 실제 물리적인 사이즈
안드로이드에서는 수 많은 스크린 사이즈를 아래와 같이 딱 4가지로 분류했다.

스크린 사이즈 : Small, Normal, Large, Extra Large


[Screen density]
스크린 상의, 일정 물리적 영역 안에 들어가는 픽셀의 양이다. 보통 dip로 표기하는데, "dots per inch"의 약자다. (Density는 밀도, 농도라는 의미인데, 정확한 해석은 모르겠다. 여기서는 그냥 덴씨티로 표기했다. ^^)
안드로이드에서는 수 많은 스크린 덴씨티(Density)를 아래와 같이 4개로 분류했다.

스크린 덴씨티 :  Low, Medium, High, Extra High

예를들어, 단말기의 스크린이 Low 덴씨티인 속성를 갖는 경우, 이 스크린은 Normal 또는 High 덴씨티 속성을 갖는 스크린보다 "일정 영역에 들어가는 픽셀의 양이 적다."라고 생각하면 된다.


[Orientation]
"Orientation"이란 말에는 "신입생 오리엔테이션"이란 뜻도 있지만, "방향성"이라는 의미도 있다. ^^
여기서의 "Orientation"은 특히, 사용자가 단말기를 바라보는 관점에서의 "스크린의 방향성"이다.
안드로이드에서는 아래와 같이 두 가지로 분류한다.

방향성 : Landscape, Portrait 

스크린의 가로세로비에 따라 Landscape는 Wide를 의미하고, Portrait는 Tall이라고 해석하면 된다.
안드로이드 단말기에 방향성이 있다는 것은 UI 개발시 주의해야할 점을 내포하고 있다.
하나는 단말기에 따라 디폴트 방향성이 무엇인지를 고려해야 한다는 점이고, 다른 하나는 디폴트 값과 상관없이 런타임 시에도 사용자가 단말기를 회전시킬 때, 방향성이 변경된다는 점이다.
 

[Resolution]
스크린에 존재하는 물리적인 픽셀의 총 개수를 의미한다. 보통 해상도라고 부른다.
안드로이드 App.에서 다양한 스크린을 지원하려고 할 때, 해상도를 직접 이용하지 않는다. 단지, 어플리케이션 단에서는 위에서 분류했던 4개의 "스크린 사이즈"와 4개의 "스크린 덴씨티"만을 고려하면 된다.


[Density-independent pixel (dp or dip)]
아마도 제일 중요한 단위다.
App개발 시, UI Layout을 잡을 때 덴씨티에 독립적인 방법으로 레이아웃의 길이, 크기, 위치를 표현하기 위해 반드시 사용해야하는 "가상의 픽셀 단위"이다.
DIP는 160 dip 스크린 위의 1개의 물리적 픽셀과 같다. 여기서 160은 "Medium" 덴씨티 스크린을 갖는 시스템(디바이스 ; 초창기 HVGA 안드로이드 기기)을 기준을 정하고, 이에 따라 기준으로 부여한 dip 값이다. 런타임 시, 시스템은 필요에 따라 개발하는 스크린의 실제 덴씨티에 기초하여, 어떠한 dip 단위의 크기조정(scaling)을 확실하게 담당해준다.

DIP 단위를 스크린 픽셀 단위로 변경하는 공식은 아래와 같다.

px = dp * (dip / 160)

예를 들면 240dip 속성을 갖는 단말기의 스크린에서는 "1dp * 240dpi / 160dp"로 계산하여, 1dp는 1.5에 해당하는 물리적인 픽셀이라는 것을 알 수 있다. 따라서 50dip는 160dpi화면에서 50px이지만, 240dpi 화면에서는 75px로 그려진다.
그리고, 위의 공식을 적절히 치환하면 아래의 공식을 만들 수 있다.

dp =  px * (160 / dp)

만약, 기존의 작업자가 UI Layout을 잡을 때, XML 속성값으로 px단위를 사용했다면, 위의 공식을 이용하여, 계산한 후, dp값으로 변경해 주는 것이 좋다. 예를 들어, 아래와 같이 ImageView의 오른쪽 여백을 20px이라고 표기되어있고, UI Layout의 기준이 되는 단말기의 스크린 덴씨티가 240dpi이라면, 20px * 160dp / 240dp를 계산하여, 13dp(약 13.33333)로 변경해 주면 된다.

<ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/image_view"
        android:layout_marginRight="20px"  ==> "13dp" 로 변경
        android:scaleType="fitCenter"/>

* 안드로이드 UI개발을 할 때는 시스템이 서로 다른 덴씨티를 갖는 스크린에 UI가 적절히 배치할 수 있도록, 언제나 dp(or dip) 단위를 사용해야 한다.

 
[Scaled Pixel (sp)] 
가변 픽셀이라고 해석하기도 하는데, 안드로이드 시스템에서는 사용자가 지정한 글꼴 크기(System.Settings 설정에 FONT_SCALE로 지정한 값)에 맞춰 sp값의 배율을 정한다. 
보통, 일반적인 이미지나 뷰는 dp(dip)값으로 부여하고, 텍스트 사이즈는 sp값을 사용하기를 강하게 권장하고 있다.



* 참고자료
안드로이드 프로그래밍2 / 마크 머피 / 에이콘출판사
http://developer.android.com/guide/practices/screens_support.html 
http://www.androidcoder.org/blog/compare-difference-textsize-unit-dp-sp-pt-px-in-mm-android-application/







Posted by 데브로망스