달력

3

« 2024/3 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
728x90
반응형

안드로이드 - Android 의 다해상도 지원 문제
원본출처:http://kese111.blogspot.kr/2012/12/android.html



 













안드로이드 기기별 해상도의 차이 때문에 골치썩는 분들 좀 많으신거 같습니다.

오늘은 아주아주 간단하게 Android에서 발생하는 다해상도 관련 문제들을 해결할 방법들을 정리 해보겠습니다. 


이 글에서 정리할 다해상도 지원 방법은 대충 이렇습니다.
1. 각 해상도 별 Layout 제작.
2. Weight 기반 Layout 제작.
3. 이도저도 싫으면 Runtime 시에 크기 맞추기.

1번. 각 해상도 별 Layout 제작.

이 방법은 별거 아닙니다.
Android 기본 프로젝트를 만들면 res floder에 기본으로
drawable-hdpi , drawable-ldpi, drawable-mdpi, drawable-xdpi
라고 폴더가 생성된걸 보셨을 겁니다.

저 위에 그림을 한번 다시 보시죠.
순서대로 ldpi 는 dpi 100부터~ ( 몇까지냐 구글 이놈들아 ) 인 것을 알 수 있습니다.
즉, 각 폴더의 -뒤에 오는 문자는 타겟 기기의 dpi를 뜻합니다.

같은 원칙으로 device의 inch 도 지정할 수 있습니다.  

그럼 이 원칙을 layout에 적용하면 어떻게 될까요? 
layout
layout-land
layout-normal-land-480x320
layout-normal-land-854x480
layout-port-480x320
layout-port-800x480

짜잔~ 요런 식입니다. 대충 무슨 뜻인지 감이 오시죠?
layout-불라불라-해상도로 만들면 대상 해상도를 위한 layout폴더가 만들어진 것 입니다.

정리하자면, 
layout-[land or port] - [ 화면 크기 ]- [ dpi ]-[ 해상도 ]

이렇게 되는것이죠.
한번 예를 들어볼까요? 샘숭 갤록시S3 는 어떨까요?

샘숭 갤록시S3를 위한 layout 폴더는 다음과 같습니다.
layout-large-xhdpi-1280x720 혹은 layout-xdpi-1280x720
입니다.

참고로 별도로 폴더를 생성하지 않은 경우에 리소스는 기본 폴더에서 가져옵니다.



이와 같은 방법은 resource의 수가 많을 수록, 용량이 클 수록 비효율적이 되지만 장점도 있습니다. 그것은 모든 기기에서 같은 품질을 유지할 수 있다는 것 입니다.



2. weight를 사용한 레이아웃 구성 방법

눈보라이야기 님 블로그를 참고하세요  - http://snowbora.com/422

weight라는 것은 가중치를 뜻합니다만, 쉽게 생각하면 %를 생각하면 될 것 같습니다.

귀찮으므로 다음으로 넘어가려다 한가지만 집고 가겠습니다.

weight를 최대한 세밀하게 잡으셔서 각 구성원들을 배치하는 곳에 LinearLayout  같은 별도의 컴퍼넌트를 배치해서 구성하는 것을 지양하셔야 됩니다. 개발자가 layout을 불러들이는 순간 허수로 넣은 Linearlayout도 객체를 생성하게 됩니다.

그러므로 버튼간 간격 등은 크게 문제가 안된다면 가급적 dp등의 수치를 사용하는게 낫다고 생각됩니다.  



3. Runtime에 크기 맞추기.

Runtime에 크기를 맞추는 것은 조금 복잡할 수 있습니다.


예를 들어 위와 같은 레이아웃이 있다고 생각해봅시다.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="320px"
    android:layout_height="460px"
    android:background="#000"
    tools:context=".MainActivity" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:src="@drawable/uwang" />

</RelativeLayout>


이 Layout은 가로 320px 세로 460px 에 딱 맞게 제작된 레이아웃입니다.
( 320x460은 우리나라에 처음 들어온 아이퐁3gs의 해상도입니다. ^_^ )

그리고 대상 타깃은 가로 480px 세로 800px 의 Google Nexus One 입니다.
해상도를 또 수정하는 것은 여간 잔망스런 일이 아닙니다.
그래서 runtime시에 기기의 해상도에 따라 맞춰줄 수 있으면 좋겠다는 생각이 들죠.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
  
 // 아래 문장은 setContentView(R.layout.activity_main) 와 같습니다.
 LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 View v = (View) inflater.inflate(R.layout.activity_main, null);
  
 DisplayMetrics displayMetrics = new DisplayMetrics();
 WindowManager wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
 // the results will be higher than using the activity context object or the getWindowManager() shortcut
 wm.getDefaultDisplay().getMetrics(displayMetrics);
 int screenWidth = displayMetrics.widthPixels;
 int screenHeight = displayMetrics.heightPixels;
 Log.v("DOIT", "screenWidth : " + screenWidth + "px , screenHeight : " + screenHeight + "px");
 ViewGroup rl = (ViewGroup) ((ViewGroup)v).getChildAt(0);
 ViewGroup.LayoutParams lp = rl.getLayoutParams();
 lp.height = screenHeight; lp.width = screenWidth;
 rl.setLayoutParams(lp);
 setContentView(v);
 
 System.out.println( "Don't use console output ");
  
}


위의 소스를 적용하면 이렇게 나옵니다. 


 




이 방법을 제대로 구현하고자 한다면,
각 컴포넌트들을 해상도 비에 따라 scaling 해주는 작업이 있어야 할 것 입니다.
나중에 제가 만들게 되면 올리기는 하겠습니다. 


자~ 이번 글에서는 다해상도를 지원하는 방법을 알아봤습니다.

방법이 모두 장단점과 문제점을 가지고 있습니다.

첫 번째 방법은,
무식해보이지만 품질 관리차원에서.
그리고 해상도별 레이아웃을 최적화 하는데는 매우 좋습니다.

예를 들어, 4인치의 레이아웃과 5인치의 레이아웃을 다르게 하는 등
더 다양한 고객 대응이 가능해 질 것 입니다.

단, 그만큼의 비용이 추가되겠죠.


두 번재 방법은,
하나의 레이아웃을 모든 화면에서 사용할 수 있으며
추가 작업이 필요 없다는 점에서는 좋습니다.

하지만, 화면을 구성하기 어렵다는 점은 여전히 맹점이죠.
예를 들어 우측으로부터 몇 dp 아래로부터 몇 dp 등을 처리하는 것은
이 weight 로 하기는 좀 까다로운 점이 있습니다.


세 번째 방법은,


두 번째 방법과 마찬가지로 하나의 레이아웃을 모든 화면에서 사용할 수 있습니다.
또한 컴퍼넌트의 배치에 제약받지 않기도 하는데,

대신 만들때 꽤나 골치가 아플 것입니다. ^~^ FIN

728x90
반응형
:
Posted by mapagilove