티스토리 뷰

Mobile/Android

[Android]치수변환

out of coding 2014. 9. 2. 16:21

안드로이드의 해상도는 엄청나게 많기 때문에 개발자가 코드에서 사용하려면 적절하게 치수를 변환해서 사용해야 한다.

여러가지 치수변환 방법이 있는데, 때에 맞도록 골라서 사용해 보도록 한다.


1. 직접 계산

장비의 밀도 비율을 구한 후 dip단위를 곱해 픽셀 단위로 계산.

밀도 비율은 DisplayMetrics 객체의 density 필드로 구한다.

density는 ldpi기준 0.75, mdpi기준 1, hdpi는 1.5... 나머지는 나열하지 않겠다.

직관적이지만 직접 수식을 구현해야 한다는 점에서 귀찮고 값을 변환할 때마다 이 과정을 반복해야 한다는 점에서 코드양이 많아진다.

또 계산된 논리 단위는 float타입이지만 픽셀은 정수이므로 소수점 이하가 버려지는 실수 절사의 문제가 있다.

캐스팅하기 전에 0.5f를 더해 반올림 할 수도 있지만 반올림이 모든 경우에 항상 옳은 것도 아니다.


2. 리소스를 이용

dimen 리소스에 크기를 정의한 후 리소스로부터 크기를 가져오는 것이다. dimens.xml은 크기값을 리소스로 정의한다.

이름을 주고 크기값을 적되 XML파일에 정의하므로 레이아웃에 배치할 때와 마찬가지로 모든 논리 단위를 사용할 수 있다.

dimens.xml파일에 버튼의 폭과 높이를 논리 단위로 기록해 놓는다.


[dimens.xml]

<dimen name="width">120dp</dimen>

<dimen name="height">50dp</dimen>


그리고 코드에서 다음 메서드로 읽어들이면 픽셀 단위로 변환된 값이 읽혀진다.

변환하는 방법에 따라 세가지 비슷한 메서드가 제공된다.


float getDimension (int id)

int getDimensionPixelOffset (int id)

int getDimensionPixelSize (int id)


이 세가지는 특별한 방법은 모르겠다.


3. 동적으로 계산

디자인 타임에 크기를 미리 알 수 없을 때는 2번과 같은 선언적인 방법을 사용할 수 없다.

이때는 다음 메서드로 바로 변환하는 것이 편리하다.


float applyDimension (int unit, float value, DisplayMetrics metrics)


보는 바와 같이 첫번째 인수로 단위를 지정하고 두번째 인수로 값을 전달하면 픽셀로 변환되어 리턴된다.


* 15dip를 px로 변환


DisplayMetrics dm = getResources().getDisplayMetrics();

int textsize = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 15, dm);

'Mobile > Android' 카테고리의 다른 글

[Android]GestureDetector  (0) 2014.09.04
[Android]ListView,ScrollView 스크롤 끝에 효과 없애기  (2) 2014.09.04
[Android]Up Navigation 설정  (0) 2014.09.01
[Android]Google Play Billing v3  (0) 2014.08.20
[Android]Overlay ActionBar  (0) 2014.08.19
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
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
글 보관함