본문 바로가기
개발/android

단말기 해상도에 관계없이 항상 같은 크기로 이미지를 보여주고 싶을때

by 매몰 2013. 8. 29.

안드로이드 앱을 만들다 보면 단말기마다 해상도가 달라 이미지 크기나 비율이 제멋대로 일때가 있다.


예를 들면 480x800 와  1080x1920에서 imageview를 100x80px로 잡으면 상대적으로 480x800보다  1080x1920에서 작게 나온다.


그래서 대부분 px 대신 dp로 하게 된다. dp로 하면 해상도에 따라 자동으로 크기를 보정해 주기 때문이다. 하지만 dp도 정확히 해상도에 비례해서 보정해 주지는 않는다.

왜냐하면 dp는 Density(인치당 픽셀수) 에 영향을 받기 때문이다


그렇다면 만약 해상도와 Density에 관계없이 항상 같은 크기로 이미지를 보여주고 싶을때는 어떻게 해야 하는가?


내가 가장 많이 사용하는 방법은 이렇다.



DisplayMetrics metrics = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(metrics);

        

int displaywidth =  metrics.widthPixels;

int displayheight =  metrics.heightPixels;



먼저 해상도를 위와 같이 가져온 다음

전체화면에 대한 비율로써 크기를 정한다  



View view = findViewById(R.id.ImageView);


int width = (int)(displaywidth * 0.3f);

view.getLayoutParams().width = width;

view.getLayoutParams().height = (int)(width * 1.4f);



이때 이미지의 고유비율이 망가지면 안되므로 height는 width에 대한 비율로 정하는것이 좋다.


예시에서는 이미지 가로길이를 전체화면 가로길이의 0.3배 만큼 잡고

이미지 세로길이를 가로길이의 1.4배만큼 한것이다.


그런데 옵티머스뷰와 같은 3:4 비율이 있기 때문에 기준을 가로길이로 잡는것도 위험할 경우가 있다. (세로길이가 많이 긴 이미지일 경우 짤릴수 있기 때문에)


이럴때는 게임에서 주로 쓰는 기법으로



float widthrate = displaywidth / 720f;

float heightrate = displayheight / 1280f;

float drawrate = (widthrate + heightrate) / 2f;


view.getLayoutParams().width = (int)(100 * drawrate);

view.getLayoutParams().height = (int)(80 * drawrate);



이런식으로 하나의 해상도를 기준으로 잡고 drawrate를 이미지크기에 곱해서 사용하는것이 좋다.

물론 이때는 가로,세로 길이를 모두 고려하므로 일부 해상도에선 크기가 달라보일수 있다.

이미지가 짤려보여선 안될때에 쓸수 있다.


예시에서는 720x1280을 기준으로 잡았다.


위와 같이 하면 모든 단말기에서 같은 크기와 같은 비율의 이미지를 볼수 있을것이다~


하지만 특별한 경우에만 이렇게 쓰고 보통은 dp를 쓰기를 권장한다.

dp는 각 단말기의 해상도와 스크린크기에 맞게 사람이 가장 보기 좋은 크기로 만들어주기 때문이다. 



외주를 받아서 앱을 제작하다보면 단말기마다 크기가 다른것 같아요~ 고쳐주세요~ 하는 요구가 있을때가 있는데 저는 보통 이럴때 제한적으로 쓰곤 합니다ㅎㅎ







 

 매몰: 고영진


 1인 개발자

     실패만 하고 있어도 꿈을 포기하지 않는 남자. 

     제가 직접 경험하고 습득한 지식을 위주로 올릴게요. 







사업자 정보 표시
주식회사 머리말 | 고영진 | 서울특별시 송파구 중대로 135 서관 10층 (가락동, 아이티벤처타워) | 사업자 등록번호 : 524-88-00727 | TEL : 010-9990-3674 | Mail : gyjmeba@hanmail.net | 통신판매신고번호 : 2017-서울강남-03941호 | 사이버몰의 이용약관 바로가기