반응형
Notice
Recent Posts
Recent Comments
«   2024/12   »
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
Archives
Today
Total
관리 메뉴

Do Something IT

[안드로이드] 각 단말기의 해상도와 Drawable 이미지의 관계, dpi 본문

Android/레이아웃

[안드로이드] 각 단말기의 해상도와 Drawable 이미지의 관계, dpi

아낙시만더 2011. 2. 17. 15:16
반응형
현재 우리가 쓰는 안드로이드 단말기에는 여러가지 크기의 화면 크기와 해상도를 지원 합니다. 
그래서 개발자 들이 작업을 할때 어려움을 격습니다. 

일단 폰의 해상도와 화면 크기에 대하여 알아보고 그 관계를 알아봅시다.

<그림1. dpi와 inches의 척도와 구분>

윗 그림1 과 같이 안드로이드는 dpi와 inches를 구분합니다.

여기서 dpi는 각 해상도의 밀도 수치를 나타 냅니다. 각 해상도의 dpi는 다르게 구별 됩니다. 이 숫치는 실제 코딩작업시 단말기에서 정의 하나 값을 받아올수 있으므로 동적으로 각 단말기 해상도에 대하여 작업 할수 있습니다. 여기서 각 단말기의 해상도 와 명칭과 각각의 dpi를 알아봅시다.

1. QVGA(240x320), 120dpi : HTC Tatoo
2. HVGA(320x480), 160dpi : 안드로원, HTC G1
3. WVGA(480x800), 240dpi : 넥서스원, 갤럭시A
4. FWVGA(480x854), 240dpi : 모토로이

위와 같은 종류로 구분이 되며 이 해상도 구분은 다른 해상도의 척도가 추가 될수 있습니다. dpi를 알아 두면 여러 단말기 작업시 조금이나마 편하게 작업 할수 있을것 입니다. 

안드로이드는 그림 1처럼  dpi에 따라 ldpi, mdpi, hdpi, xhdpi 로 구분하였습니다. 


inches는 단말기의 화면 인치를 이야기 합니다. 그림 1처럼 안드로이드는 small, normal, large, xlarge로 구분합니다.
inches가 커진다구 해서 화면이 커질뿐 화질이 선명해지지는 않습니다. 
해상도가 크면 클수록 이미지는 디테일 해지고 선명해집니다.

자 여기까지 inches와 dpi에 대해 이해가 되었다고 생각 됩니다.

그럼 dpi와 Drawable 이미지 폴더에 대한 관계를 이해하여 봅시다. 

Drawable 폴더는 1.5 버전까지는 제목 그대로 하나의 폴더로 존재 했었습니다. 하지만 여러 단말기와 해상도가 등장하고 1.6버전부터 세분화되어 drawable-hdpi, drawable-mdpi, drawable-ldpi 등으로 나뉘어 졌습니다. 이는 위에서 보았던 dpi숫치에 따른 ldpi, mdpi, hdpi, xhdpi 따른 구분이라 볼수 있습니다. 여러분이 작업을 할때 ldpi와 mdpi용으로 작성했었을시 여러분은 ldpi용 이미지와 mdpi용 이미지가 필요 할 것입니다. 

여러분은 그 이미지를 구분 하여 각각의 폴더에 넣어야 합니다. 

그 이유는 각 단말기에서 리소스 이미지를 읽어 bitmap형으로 변환 컴파일 할시 의도 하지 않은 문제가 발생 할수도 있기 때문입니다. 단말기가 mdpi 단말기라면 drawable-mdpi 폰에 넣어야 합니다. 

그 이유는 mdpi 단말기에서 drawable-mdpi폴더의 이미지를 읽을때 그 크기 그대로를 들고 옵니다, 하지만 리소스 이미지가 만약 drawable-hdpi폴더에 있다면 그 이미지의 크기의 1.5배를 곱한 크기의 비트맵 이미지를 생성 합니다. 즉 당신이 의도했던 이미지 보다 큰 비트맵이 생성되어 단말기 화면에 뜨게 되는 것입니다. 

그 원인은 단말기에서 비트맵 생성시 drawable-mdpi이외의 폴더는 그 크기가 해당폴더 해상도에 맞춰진 이미지가 있다고 판단 하고 단말기dpi에 맞게 변환되어 생성되기 때문입니다.

여러분은 이를 잘구분하여 이미지를 적용 하여야 할 것입니다.

이 외에도 화면 inches 에따라 layout폴더도 구분이 됩니다.
이는 res/layout , res/layout-small ,res/layout-land ,res/layout-large-land ,res/layout-xlarge 로 구분됩니다.

이렇게 폴더를 구분하는 이유는 아마도 각 단말기 해상도나 인치에 따라 빠른 비트맵생성, 뷰 생성에 목적이 있다고 생각 됩니다.

1. Window 해상도 구하는 코드
Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();

2. View 해상도
int mWidth = getContext().getResources().getDisplayMetrics().widthPixels;
int mHeight = getContext().getResources().getDisplayMetrics().heightPixels;

3. dpi 구하는 코드
        DisplayMetrics mOutMetrics = new DisplayMetrics();
     getWindowManager().getDefaultDisplay().getMetrics(mOutMetrics);
     int mDpi =mOutMetrics.densityDpi;



ps. 안녕하세요. 안드로이드 신입개발자 아낙입니다. 이때까지 혼자 볼수 있도록 블로그를 사용 했었는데 앞으로는 함께 정보를 공유 하고 서로 배울수 있는 블로그로 태어 나기위해 공개 포스팅 형식으로 적을까... 합니다. 저 나름대로 정리 해본 글인데 틀리거나 이상한점 있으시면 바로 답글 적어주세요. 그리고 도움이되셨다면 댓글 한줄 적어주시면 감사 하겠습니다.

반응형
Comments