px, dp, sp의 차이와 상호 전환

4030 단어 dp유닛px

px:


즉 픽셀, 1px는 화면의 물리적 픽셀을 대표한다.
px 단위는 사용을 권장하지 않습니다. 같은 100px 사진은 핸드폰에 표시되는 실제 크기가 다를 수 있기 때문입니다.
간혹 px를 사용하는 경우 1픽셀 표선이나 음영선을 그려야 할 때 다른 단위인 dp를 사용하면 모호해 보인다.

dp:


이것은 가장 자주 사용하지만 가장 이해하기 어려운 사이즈 단위다.그것은'픽셀 밀도'와 밀접한 관계가 있기 때문에 우선 픽셀 밀도가 무엇인지 설명해 봅시다.만약에 핸드폰이 하나 있는데 화면의 물리적 사이즈가 1.5인치 x 2인치이고 화면 해상도가 240x320이라고 가정하면 우리는 이 핸드폰의 화면에 인치당 포함된 픽셀의 수량은 240/1.5=160dpi(가로) 또는 320/2=160dpi(세로)이고 160dpi는 이 핸드폰의 픽셀 밀도이다. 픽셀 밀도의 단위인 dpi는 DotsPer Inch의 줄임말, 즉 인치당 픽셀 수량이다.가로와 세로의 이 값은 모두 같다. 대부분의 휴대전화 화면은 정사각형의 화소점을 사용하기 때문이다.
서로 다른 휴대전화/태블릿PC는 서로 다른 픽셀 밀도를 가지고 있을 수 있다. 예를 들어 같은 4인치 휴대전화는 480x320 해상도도 800x480 해상도도 있는데 전자의 픽셀 밀도는 비교적 낮다.안드로이드 시스템은 네 가지 픽셀 밀도를 정의했다. 저(120dpi), 중(160dpi), 고(240dpi)와 초고(320dpi)이다. 이에 대응하는 dp에서 px까지의 계수는 각각 0.75, 1, 1.5와 2이고 이 계수에 dp 길이를 곱하면 픽셀 수이다.예를 들어 인터페이스에 길이가'80dp'인 그림이 있는데 240dpi의 휴대전화에 실제적으로 80x1로 나타난다.5=120px, 320dpi의 휴대전화에서 실제 80x2=160px로 나타난다.만약 네가 이 두 개의 휴대전화를 함께 놓고 비교한다면, 이 그림의 물리적 사이즈가 많지 않다는 것을 발견할 수 있을 것이다
그러나 프로그램 하나를 써서 폭이 320dp와 같은 횡선을 그려 서로 다른 휴대전화에서 운행하면 어떤 휴대전화에서는 횡선이 휴대전화 화면보다 짧고 어떤 휴대전화는 화면보다 길며 태블릿PC에서는 휴대전화와 비교해 차이가 더욱 뚜렷하다는 것을 발견할 수 있다.

dip:


dp와 완전히 같습니다. 다만 이름이 다를 뿐입니다.초기의 안드로이드 버전에서는 dip을 많이 사용했는데 sp와 통일하기 위해 dp라는 이름을 추천했다.

sp:


확대/축소와 무관한 추상 픽셀(Scale-independent Pixel)sp와 dp는 유사하지만 유일한 차이점은 안드로이드 시스템은 사용자가 문자 크기(소, 정상, 대, 초대형 등)를 사용자 정의할 수 있다는 것이다. 문자 크기가'정상'일 때 1sp=1dp=0.00625인치이고 문자 크기가'큰'또는'초대'일 때 1sp>1dp=0.00625인치이다.윈도우즈에서 글꼴 크기를 조정한 후의 효과 - 창 크기는 변하지 않고 텍스트 크기만 바뀐다.
덜 사용되는 치수 단위는 다음과 같습니다.

mm:


즉 밀리미터;

in:


즉 인치, 1인치 = 2.54cm(약).

pt:


1pt=1/72인치 = 0.035cm;
도량 단위의 환산 공식은android 원본 패키지 TypedValue에 있습니다.java에서 다음과 같은 함수를 보겠습니다.
 
  
  public static float applyDimension(int unit, float value,
   DisplayMetrics metrics)
   {
 switch (unit) {
 case COMPLEX_UNIT_PX:
     return value;
 case COMPLEX_UNIT_DIP:
     return value * metrics.density;
 case COMPLEX_UNIT_SP:
     return value * metrics.scaledDensity;
 case COMPLEX_UNIT_PT:
     return value * metrics.xdpi * (1.0f/72);
 case COMPLEX_UNIT_IN:
     return value * metrics.xdpi;
 case COMPLEX_UNIT_MM:
     return value * metrics.xdpi * (1.0f/25.4f);
 }
 return 0;
    }

요약:
구글의 조언에 따르면 TextView의 글꼴은 sp를 단위로 하는 것이 가장 좋고 TextView의 원본 코드를 보면 안드로이드는 기본적으로 sp를 글꼴 단위로 사용합니다.dip을 다른 요소의 단위로 사용합니다.
px = dp*ppi/160, 화면 밀도가 160이면 px = dip
dp = px/(ppi/ 160)
px = sp*ppi/160
sp = px/(ppi/ 160)
dp = sp?
dp 회전 px
<span style="font-size:14px;">public static int dip2px(Context context, float dpValue) {
    final float scale = context.getResources().getDisplayMetrics().density;
    return (int) (dpValue * scale + 0.5f);
}</span>

px에서 dp로 전환
<span style="font-size:14px;">public static int px2dip(Context context, float pxValue) {
    final float scale = context.getResources().getDisplayMetrics().density;
    return (int) (pxValue / scale + 0.5f);
}</span>

좋은 웹페이지 즐겨찾기