Android Screen Geometry Fun

[이 포스트는 Tim Bray 에 의해 작성되었습니다.]

http://android-developers.blogspot.com/2010/09/screen-geometry-fun.html

갤럭시탭이 공식 출시된지 얼마 되지 않았습니다. 갤러시 탭용 어플리케이션에 관심 있는 개발자 분들도  많을 거 같은데요, 올라온지는 조금 오래되었지만 갤럭시 탭과 관련하여, 안드로이드 개발자 블로그의 주인장 Tib Bray 가 작성한 포스트가 있어서 번역해 보았습니다. 갤럭시 탭용 AVD 관련 이야기도 있으니 관심있으신 분들은 한번 읽어보세요~~

 얼마전에 발표된 삼성 갤럭시 탭은 안드로이드 개발자들에게 경종을 울리고 있습니다. 갤럭시 탭은 우리가 지금까지 보지 못했던 해상도를 갖고 있거든요. 그나마 다행스럽게도, 새로운 해상도에도 불구하고 대부분의 기존 어플리케이션은 동작하며, (사실 제가 테스트해본 많은 어플들은 오히려 더 멋지게 보이던군요.) 문제를 일으킬만한 부분들도 비교적 손 쉽게 수정할 수 있을 것으로 보입니다. 이번 포스트에는 갤럭시 탭외에도 앞으로 출시된 다양한 종류의 디바이스들에서 잘 동작하는 어플리케이션을 작성하기 위하여 알아두어야할 몇 가지 내용을 담고 있습니다.

갤럭시 탭은 다른 안드로이드 폰들과는 이런 점에서 다릅니다.

  • 스크린 사이즈는 1024x600 입니다. 다른 어떤 안드로이드 호환 디바이스도 1000 픽셀의 해상도를 갖은 적이 없습니다.
  • 대부분의 사용자들이 많은 시간 갤럭시 탭을 랜드스케이프 모드(가로)로 사용합니다.

 우선 시작하기에 앞서, 시간을 들여 다양한 해상도의 스크린을 지원하는 방법에 관한 문서를 읽어보시길 권장합니다. 이에 관련된 새로운 내용이 있을 때마다, 안드로이드 개발팀은 해당 문서를 수정할 것 입니다. 또한, 최근 안드로이드 개발자 블로그에 랜드스케이프 모드를 기본적으로 처리해야할 때 알아두어야 할 내용이 담긴 포스트(주>번역완료 문서!)를 업데이트하기도 하였습니다.

Density 는 어떤 의미를 갖고일까요?

 여러분이 어플리케이션을 만들 때, 어플리케이션의 레이아웃과 그래픽 리소스를 화면 Density 와 화면 크기, 가로 세로 모드에 따라 다양하게 준비해 두어야합니다. 분명 이것들 각각을 일일히 챙기는 것은 멋진 레이아웃을 디자인하거나 똑똑한 인텐트 필터를 설계하는 것 처럼 재미있는 일은 아닙니다. 하지만, 꼭 필요한 일입니다.

 그런데, 화면의 Density 의 관점에서, 삼성의 갤럭시 탭은 한가지 재미있는 점이 있습니다. 여러분이 계산을 좀 해본다면, 갤러시 탭 스크린의 170DPI 는 다른 고해상도 안드로이드 디바이스에 비하면 훨씬 낮은 수치임을 알 수 있을 것 입니다. 그럼에도 불구 하고 자기 자신을 'hdpi' 의 'largre' 스크린 사이즈의 디바이스라고 선언하고 있습니다. 이유가 뭘까요? 바로, 그렇게 하는 편이 더 보기 좋기 때문입니다.

 만일 갤럭시 탭이170DPI 에 맞추어서, 'mdpi' 로 설정된 이미지 리소스를 활용한다면, 개별 이미지 이미지는 가장 적절하게 표시될 것 입니다. 하지만, 이경우 갤럭시 탭의 화면 크기에 비해, 각 버튼과 버튼, 혹은 아이콘과 아이콘 사이가 너무 떨어지게 됨으로, 화면이 텅 빈 것 처럼 보일 수도 있습니다. 대신에 'hdpi' 로 모드를 설정하게 되면, 안드로이드 프레임워크가 리소스의 크기를 적절한 수준으로 확대해 줍니다.

 저는 사진 찍는 취미가 있습니다. 좋은 사진을 찍기 위해서는 피사체에 따라 카메라에서 적절하게 ISO 값과, 셔터 스피드, 노출등의 값을 수정해야 하지요. 예를 들어, 만일 여러분이 점프하는 무용수를 찍기위해 셔터 스피드를 빠르게 하고 싶은 경우, 노출을 크게 하고, ISO 값을 민감하게 조절해야합니다. 이와 유사하게, 갤럭시 탭의 스크린은 매우 크기 때문에, 자신을 'hdpi' 로 선언함으로서 개별 이미지의 품질은 조금 떨어질 수 있어도 화면 전체적으로 볼 때 좀 더 좋은 화면을 보여줄 수 있게 됩니다.

 한가지 좋은 소식을 말씀드릴게요. 프레임워크에서 적용되어 있는 스케일업 코드는 매우 빠르고 효율적으로 작성되어있습니다. 제가 만든 어플리케이션도 갤럭시 탭에서 꽤나 좋게 보이는군요. 여기 제가 작성한 "Life Saver 2" 어플리케이션 첫 페이지의 스크린샷이 있습니다. 첫번째 것은 넥서스원에서 두 번째 것은 갤럭시 탭에서 구현되어 있습니다. 서로 다른 Densities, 다른 지오메트리지만, 두 가지 버전은 모두 정상적으로 작동하며, 사실 갤럭시 탭에서 더 보기 좋습니다.

 여러가지 말씀드렸지만, 여러분이 기억하셔야 할 점은 한 가지 입니다. 가능한 3 가지 해상도 모두를 위한 별도의 그래픽 리소스를 마련해 두시는 편이 좋습니다. 그러면 안드로이드 프레임워크가 다양한 디바이스단에서 가장 보기 좋은 방식으로 여러분의 어플리케이션을 표현해 줄 것입니다. (주> 첨엄을 덧 붙이자면, 'ldpi' 는 무시하셔도 좋습니다. 이 카테고리에 속하는 단말은 거의 없거든요. http://d.android.com/resources/dashboard/screens.html )

일이 꼬일 수도 있습니다.

 제가 이야기한 것 처럼, 대부분의 어플리케이션은 갤럭시 탭과 같은 디바이스에서도 잘 동작하며, 별다르게 수정할 필요조차 없습니다. 하지만. 물론 이상하게 보이는 어플리케이션이나, 아예 동작을 하지 않는 어플리케이션도 있습니다. 예를 들자면:

  • AbsoluteLayout 을 사용하는 경우. 문제를 일으키는 확실한 방법입니다.

  • DIP 대신 Pixel 값을 사용하는 경우.

  • 어떤 어플리케이션은 NullPointerException 을 발생 시키며 종료되기도 했습니다. 이는 해당 어플리케이션은 안드로이드 프레임워크를 통해서가 아니라 고유한 방법으로 리소스들을 읽어 들이는 경우 발생했는데, 해당 루틴이 1024x600 해상도의 디바이스를 고려하지 않고 작성되어 있었습니다. 이런 문제는, 어플리케이션이 리소스 로딩을 안드로이드 프레임워크에 위임하거나 최소한 자신들이 처리할 수 없는 경우에는 기본적으로 안드로이드 프레임워크가 해당 작업을 수행하도록 작성되면 회피할 수 있을 것 입니다.

신발 곽에서 벗어나기

 제가 살펴본 또다른 어플리케이션은 마치 '신발 곽' 에 쌓여있는 것 처럼, 화면 정 중앙에서, 넓은 검은 색 테두리가 둘러져있는 형태로 동작하기도 했습니다. 뭐, 동작에는 별다른 이상이 없습니다만 좀 우습게 보이는 것이 사실입니다. 그리고 이러한 문제점을 회피하는 것도 쉽습니다. 이러한 문제는 여러분이 targetSdkVersion 을 4 보다 더 작은 값으로 사용한 경우에 발생하며, 이 경우 안드로이드 프레임워크는 여러분의 어플리케이션이 Cupcake 버전을 대상으로 작성되었으며, HVGA 해상도만을 지원한다고 판단하게 됩니다.

 어떤 경우던, 만일 여러분의 어플리케이션에 신발 곽으로 포장된 형태로 동작하길 원하지 않는 다면, supports-screens 엘리먼트를 활용하시기 바랍니다. 아래와 같이 말이지요.

android:largeScreens="true" android:anyDensity="true" />

(두 가지 속성 값 모두 API 레벨 버전 4 이전의 경우 기본적으로 'false' 값으로 설정되어 있습니다.) 이렇게 하면, 상상할 수 있는 어떠한 안드로이드 스크린에서도 안드로이드 프레임워크가 적절한 방법으로 여러분의 어플리케이션을 표현해 줄 것 입니다.

테스트 하기

 만일 이전에는 없던 새로운 디바이스가 발표되었는데, 해당 디바이스를 구할 길은 없다면 여러분의 어플리케이션이 새로운 디바이스에서 잘 동작할지를 확인 할 수 있는 방법은 오직 한 가지 뿐입니다. 바로 안드로이드 에뮬레이터를 활용하는 것 이지요. 에뮬레이터는 현존하는 디바이스 또한 앞으로 출시될 디바이스들을 모두 커버할 수 있을 만큼 유연하게 작성되었습니다.

 갤럭시 탭의 경우, 어플리케이션 개발을 돕기 위하여 삼성은 커스텀 AVD 와 스킨 그리고 SDK 에드온을 제공할 것 입니다. (주> http://innovator.samsungmobile.com/galaxyTab.do )


왜 이런 귀찮은 일들을 해야되나요?

 왜냐하면, 2010 년이 지나고 나면, 안드로이드는 더이상 휴대폰 만을 위한 플랫폼이 아니기 때문입니다. 다양한 해상도를 지원하기 위한 여러분의 작은 노력은 여러분의 어플리케이션이 정말로 다양한 새로운 종류의 어플리케이션에서 동작할 수 있게 만드는 큰 혜택으로 돌아올 것 입니다.