1. dpi (Dot Per Inch)
1인치당 픽셀 수. 물리적 단위인 1 inch (=2.54cm)에 몇 픽셀이 들어가는가를 나타내는 단위다.
Low density (120dpi) : ldpi
Medium density (160dpi) : mdpi
High density (240dpi) : hdpi
Extra High density (320dpi) : xdpi
2. px
스크린의 실제 픽셀 단위를 사용하며, 실제 크기나 밀도와 상관이 없다. mdpi(160dip)에서 1dp = 1px 이다. 따라서
ldpi : 1dp = 0.75px
mdpi : 1dp = 1px
hdpi : 1dp = 1.5px
xdpi : 1dp = 2px;
3. dp 와 dip (Density Independent Pixel)
말 그대로 실제 픽셀에 독립적인 단위로 안드로이드 폰의 다양한 해상도를 지원하기 위해 만든 단위이다. 큰 화면이든 작은 화면이든 같은 크기로 나타나게 되어있다. (그러나 적용해보면 미세하게 다르다..) 즉, 화면이 작은 폰에서 10원짜리 만하게 나타난다면 화면이 큰 폰에서도 10원짜리 만하게 나타나도록 되어있다. dp(dip)와 px간의 변환을 하는 방법은 아래와 같다.
dp(dip)와 px간의 변환
px = dp * (160 / dpi) = dp * density
dp = px / (160 / dpi) = px / density
여기서 density는 density = dpi / 160 계산 한다.
ldpi : density = 0.75
mdpi : density = 1
hdpi : density = 1.5
xdpi : density = 2
※ dpi와 density 구하는 방법
DisplayMetrics outMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
int dpi = outMetrics.densityDpi;
float density = outMetrics.density;
※ java코드에서 dp를 px로 바꾸는 방법
java코드에서 density또는 dpi를 이용해서 dp를 px로 변환할 수도 있지만 TypedValue를 이용해서 다음과 같이 구할 수 있다.
public int dpToPixel(int dp){
int px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, DP, context.getResources().getDisplayMetrics());
}
4. sp
dp와 비슷하지만 사용자가 선택한 글꼴 크기에 의해 크기가 조절된다.
5. SP(Scale-Independent Pixels) vs DP(Density-Independent Pixels)
-SP(Scale-Independent Pixels) : 직역하면 스케일 독립 픽셀 단위로, 시스템이 지정한 font size에 영향을 받음.
-DP(Density-Independent Pixels) : 직역하면 밀도 독립 픽셀 단위로, 장치의 밀도에 상관없이 물리적으로 동일한 크기를 갖음.
SP는 글자 크기가 시스템에 따라 유연하게 변하지만 DP는 시스템에 영향을 받지 않고 늘 고정적인 크기를 가지는 것입니다.
요약
- 레아이웃 등의 UI적 요소는 dp(dip) 사용을 권장.
(dp를 쓴다고 모두 해결되는 것은 아님)
- 글자 크기에는 sp를 사용을 권장.
- 되도록이면px는 지양(상대적이지 못하고 절대적)
https://voyun.tistory.com/5
https://ccdev.tistory.com/9?category=554484
'Basic > Android' 카테고리의 다른 글
Easing functions 공식 및 그림 (0) | 2019.12.12 |
---|---|
다각형 영역으로 이미지 자르기 (0) | 2019.11.19 |
Android View의 상대 좌표 (0) | 2019.11.17 |
Android title bar 제거하는 간단한 코드 (0) | 2019.11.13 |
Android exception 모음 (0) | 2019.11.07 |