안드로이드 앱을 만들다 보면 단말기마다 해상도가 달라 이미지 크기나 비율이 제멋대로 일때가 있다.
예를 들면 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는 각 단말기의 해상도와 스크린크기에 맞게 사람이 가장 보기 좋은 크기로 만들어주기 때문이다.
외주를 받아서 앱을 제작하다보면 단말기마다 크기가 다른것 같아요~ 고쳐주세요~ 하는 요구가 있을때가 있는데 저는 보통 이럴때 제한적으로 쓰곤 합니다ㅎㅎ
'개발 > android' 카테고리의 다른 글
페이스북 안드로이드 sdk로 담벼락 글쓰기... 정리 2가지 (1) | 2014.01.09 |
---|---|
스레드에서 View 변경시 Only the original thread…. 에러 대처법 (0) | 2013.11.25 |
배경 Layout을 손가락 터치로 따라 움직이게 하는 방법 (0) | 2013.10.08 |
큰 배경이미지 사용시 OutOfMemoryError의 확실한 해결법 (12) | 2013.10.04 |
페이스북앱이 설치되어 있을때 페이스북 api로 로그인이 안되는 문제 (21) | 2013.08.23 |