Android는 일반적으로 두가지 속성을 사용하여 디바이스의 화면을 분류합니다.: 크기(Size)와 밀도(Density)
여러분은 여러분의 앱이 크기(Size)와 밀도(Density) 모두의 범위 안에서 화면에 설치될 것을 기대합니다. 여러분은 다른 화면 크기(Size)와 밀도(Density)에 대해 앱의 모양을 최적화하도록 몇가지 대체 리소스를 포함해야만 합니다.
° 4가지의 일반화된 크기들(Sizes) : small, normal, large, xlarge
° 4가지의 일반화된 밀도들(Densities) : low(ldpi), medium(mdpi), high(hdpi), extra high(xhdpi)
여러분이 다른 화면의 크기(size)와 밀도(density)에 대해 다른 레이아웃(layout)과 비트맵(bitmap)을 선언하기 위해서는 "다른 언어에서의 문자열 지원하기"(Supporting Difference Language)에서 했던 방법과 유사하게 대체 리소스들을 별도의 디렉토리들에 배치해야 합니다.
또한 화면 방향(가로 or 세로, landscape or portrait)은 화면 크기의 변화로 간주된다는 것을 알아야 합니다. 그래서 많은 앱들은 각 방향에 대해 사용자 경험(User Experience : UX)을 최적화 하기 위한 레이아웃으로 수정해야 만 합니다.
다른 레이아웃들(Different Layouts) 만들기
----------------------------------------
서로 다른 화면 사이즈에서 UX 를 최적화 하기 위해서, 여러분은 여러분이 지원하길 원하는 각 각의 화면 사이즈에 대한 고유한 레이아웃XML 파일을 만들어야 합니다. 각 레이아웃은 -<screen_size>를 이름 뒤에 접미사로 붙여 만들어진 알맞은 layout 리소스 디렉토리에 저장해야만 합니다. 예를 들어, large 화면에 대해 하나의 고유한 레이아웃을 res/layout-large/ 안에 저장해야 합니다.
Note : 안드로이드는 화면에 알맞게 맞추기위해 자동으로 여러분의 레이아웃을 스케일합니다. 그러므로, 여러분의 레이아웃은 UI 요소의 절대적인 사이즈에 대해 걱정할 필요없이 서로 다른 화면 사이즈에 배치할 수 있습니다. 대신 사용자경험(user experiece : UX)에-(다른 형제뷰들과 관련한 중요한 뷰들의 사이즈와 위치같은) 영향을 주는 레이아웃에 초점을 두어야 합니다.
예들들어, 이 프로젝트는 기본적인 레이아웃과 large 사이즈의 화면 대체 레이아웃을 포함하고 있습니다.
MyProject/
res/
layout/
main.xml
layout-large/
main.xml
이 xml 파일 이름은 반드시 같아야 합니다. 하지만 그들의 컨텐츠는(Contents) 화면 사이즈에 해당하는 최적화된 UI 를 제공하기 위해 서로 다릅니다.
늘 그랬듯이 여러분의 앱 레이아웃을 단순하게 참조합니다.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } |
시스템은 앱이 실행될 때, 실행하고 있는 디바이스의 화면 사이즈를 기반으로 적절한 레이아웃 디렉토리로부터 레이아웃 파일을 읽어들입니다. 개발자 사이트의 Providing Resources 가이드에 안드로이드가 어떻게 적절할 리소스를 선택하는지에 대한 추가 정보가 있습니다.
또 다른 예로서, 이 프로젝트는 가로(landscape) 방향(orientation)에 대한 대체 레이아웃을 가지고 있습니다.
MyProject/
res/
layout/
main.xml
layout-land/
main.xml
기본적으로 layout/main.xml 파일은 세로(Portrait) 방향으로 사용되어 집니다.
만약 여러분이 특별하게 large 사이즈를 포함하고 있는 가로(landscape) 방향에 대한 레이아웃을 제공하기 원한다면, 여러분은 large와land 규정자 모두 사용할 필요가 있습니다.
MyProject/
res/
layout/ # default (portrait)
main.xml
layout-land/ # landscape
main.xml
layout-large/ # large (portrait)
main.xml
layout-large-land/ # large landscape
main.xml
Note: Android 3.2 이상에서는 밀도에 독립적인 픽셀(density-independent pixel : dip)의 간격으로 최소 폭과 높이를 기반으로 화면사이즈에 대한 리소스를 지정할 수 있도록 화면 사이즈를 정의하는 고급 방법을 지원합니다. 이번 시간에는 이 새로운 기술에 대한 부분은 다루지 않습니다. 추가 정보를 원하시면, 개발자 사이트의 Designed for Multiple Screens 를 참조하시기 바랍니다.
다른 비트맵(Bitmaps) 만들기
---------------------------
여러분은 언제나 일반화된 밀도 버킷(density buckets : low, medium, high and extra high density)에 알맞게 스케일된(scaled) 각각의 비트맵(bitmap) 리소스를 제공해야 합니다. 이렇게 하면 모든 화면 밀도에 좋은 그래픽 품질과 성능을 달성하는데 도움이 됩니다.
이러한 이미지를 생성하려면, 여러분은 벡터 형식으로 아래 나와있는 사이즈 비율(size scale)을 사용하여 각 밀도에 대한 이미지를 생성해야 합니다.
° xhdpi : 2.0
° hdpi : 1.5
° mdpi : 1.0 (baseline)
° ldpi : 0.75
이는 여러분이 만약 xhdpi 디바이스에 대해 200*200 사이즈의이미지를 생성했다면, 같은 이미지를 hdpi에 150*150, mdpi에 100*100, ldpi에 75*75 로 생성해야 한다는 것을 의미합니다.
그런 다음, 알맞은 drawable 리소스 디렉토리안에 이 파일들을 위치합니다.
MyProject/
res/
drawable-xhdpi/
awesomeimage.png
drawable-hdpi/
awesomeimage.png
drawable-mdpi/
awesomeimage.png
drawable-ldpi/
awesomeimage.png
언제든 여러분은 @drawable/awesomeimage 로 참조하면 시스템은 여러분의 화면 밀도를 기반으로 알맞은 비트맵(bitmap)을 선택합니다.
Note: Low-density(ldpi) 리소스는 항상 필요로 하지는 않습니다. 여러분이 hdpi 자원를 제공했을 때, 시스템은 자동으로 ldpi 화면에 적절하게 맞추기 위해 그 것들을 절반으로 줄여서 사용합니다.
개발자 사이트의 Iconography design 가이드에서 icon 자원들을 만드는 가이드와 팁에 대해 참고하실 수 있습니다.
'Android 개발자사이트 튜토리얼' 카테고리의 다른 글
액티비티 생명주기 관리하기(Managing the Activity Lifecycle) (0) | 2015.03.27 |
---|---|
다른 플랫폼 버전들 지원하기(Supporting Difference Platform Versions) (0) | 2015.03.27 |
다른 언어들 지원하기(Supporting Difference Languages) (0) | 2015.03.27 |
서로 다른 디바이스들 지원하기(Supporting Different Devices) (0) | 2015.03.27 |
액션바(Action Bar) 오버레이(Overlaying) 하기 (0) | 2015.03.27 |