[안드로이드] 안드로이드 개발 중 dip, dpi, density, px 등 상세 설명

5439 단어
안드로이드 개발 중인 다양한 단위의 설명
  • Px(Pixel 픽셀)는 이미지 요소라고도 하는데 이미지로 구성된 기본 단원으로 한 픽셀의 크기가 고정되지 않고 화면 크기와 픽셀 수량의 관계 변화에 따른다(화면이 클수록 픽셀이 낮고 한 픽셀이 클수록 반대로도 마찬가지이다).그래서 픽셀을 디자인 단위로 사용할 때 서로 다른 장치에서 축소되거나 늘어나는 경우가 있을 수 있다.
  • Resolution(해상도)은 화면의 수직과 수평 방향의 픽셀 수를 가리키며, 해상도가 1920*1080이면 수직 방향은 1920개의 픽셀, 수평 방향은 1080개의 픽셀이다.
  • Dpi(픽셀 밀도)는 화면의 인치(1인치 = 2.54cm) 거리에 몇 개의 픽셀 포인트가 있는지를 말한다.화면 길이가 320*240이면 가로 2인치, 세로 1.5인치, Dpi = 320/2 = 240/1.5 = 160입니다.
  • 덴시티(밀도) 이것은 화면에 있는 평방 인치(2.54 ^ 2평방 센티미터)당 픽셀 수를 가리킨다.
  • Dip/dp(설비 독립 픽셀)도 dp라고 할 수 있다. 길이 단위, 같은 단위는 서로 다른 설비에서 서로 다른 디스플레이 효과가 있는데 구체적인 효과는 설비의 밀도에 따라 달라진다. 상세한 공식은 아래를 보십시오.

  • 계산 규칙
    우리는 4.95인치 1920* 1080의 넥서스5 휴대전화 설비를 예로 들었다.
    Dpi :
  • 직각변 픽셀 수량 계산: 19202+10802=2202^2(피타고라스정리).
  • DPI: 2202/4.95 = 445 계산
  • 이 장치를 얻은 DPI는 445(인치당 445개의 픽셀)이다.

  • Density
    위에서 인치당 440픽셀을 얻으면density는 제곱인치당 픽셀 수량으로 445^2=198025이어야 한다.
    Dip
  • 선명백이라는 개념으로 화면에 나타나는 모든 이미지는 px 단위이다.
  • Dip는 우리가 개발하는 데 사용하는 길이 단위이고 마지막에 그도 px로 전환해야 한다.
  • 이 장치에서 1dip이 얼마나 되는지 계산하기 px:px=dipxdpi/160px=1x445/160=2.78
  • 위의 계산을 통해 이 장치에 1dip=2.78px가 있음을 알 수 있다. 그러면 이것은 진실한 이야기인가?nononono, 그중의 관건치 dpi는 우리가 계산한 445가 아닙니다. 아래를 보세요.

  • 안드로이드 시스템 정의 Dpi
    위에서 계산한 445Dpi는 4.95인치 아래의 1920*1080 핸드폰인데 4.75 해상도 아래라면?4.55 해상도에서는요?...같은 해상도가 다른 화면 사이즈에서도 Dpi가 같지 않다는 것을 알 수 있다.이 문제를 해결하기 위해 안드로이드에는 몇 개의 기본 Dpi가 내장되어 있으며 특정한 해상도에서 자동으로 호출되고 설정 파일에서 수동으로 수정할 수 있습니다.
    ldpi
    mdpi
    hdpi
    xhdpi
    xxhdpi
    해상도
    240x320
    320x480
    480x800
    720x1280
    1080x1920
    시스템 dpi
    120
    160
    240
    320
    480
    기준 축척
    0.75
    1
    1.5
    2
    3
    이것은 내장된 Dpi입니다. 무슨 뜻입니까?1920*1080 해상도 핸드폰에서는 기본적으로 480의 dpi를 사용합니다. 사이즈가 얼마든지 상관없습니다. 공장에서 수동으로 프로필을 수정하지 않으면 나중에 다시 이야기합시다.우리가 직접 시도해 보자.
    
    

    이것은 textview로 높이는 200dp이고 너비는 100dp이다.이전 공식에 따라 수동으로 계산합니다.
    height = 100 x 445 / 160 = 278.5px
    width  = 200 x 445 / 160 = 556.25px
    

    다음 코드로 컨트롤의 실제 픽셀을 가져와 동일한지 확인합니다.
    layout = (RelativeLayout)findViewById(R.id.la);
    //                  ,           
    layout.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener()     {    
      public boolean onPreDraw() {        
        Log.d("hehehe", textView.getHeight() + "/" + textView.getWidth());       
        return true;    
      }
    });
    

    결과 출력: 300/600 내부 계산 프로세스:
    height = 100 x 480 / 160 = 300px
    width  = 200 x 480 / 160 = 600px
    

    그중 160은 기준치가 변하지 않고 100과 200은 우리가 설정한 dp이다. 그러면 이 480은 어디에서 왔을까?445로 했네?우리 핸드폰에 있는/system/build을 찾으세요.prop 파일 중 한 줄은 다음과 같습니다: ro.sf.lcd_density=480이것은 이 기종이 사용하는 dpi가 얼마나 되는지 지정하고, 또 다른 상황은 이 줄이 없다는 것이다. (내가 아날로그에서 발견한 적이 있다.) 그러면 표의 해상도에 따라 자동으로 설정해야 한다.
    이 동작을 변경합니다: ro.sf.lcd_density=320위의 테스트 코드를 다시 실행하여 출력 결과: 200/400 내부 계산 프로세스:
    height = 100 x 320 / 160 = 200px
    width  = 200 x 320 / 160 = 400px
    

    말하자면, dpi라는 동적 계수가 있기 때문에, 우리는 dp를 사용할 때 서로 다른 해상도 장치를 호환할 수 있다.
    여기까지 dpi의 유래와 시스템 dpi가 물리적 dpi와 반드시 같지 않다는 것을 깨달았을 것이다.시스템에서 사용하는 것은 모두 시스템 dpi입니다. 물리적 dpi를 사용하지 않아도 물리적 dpi를 얻을 수 없습니다.물리적 dpi는 주로 제조업체가 휴대전화에 대한 매개 변수에 대한 설명에 사용된다(ppi로도 볼 수 있다)!
    그리고표에 또 하나의 것을 기준비례라고 하는데 이것은 사실 dp->px에서 중요한 계수를 계산하는 것이다. 160을 기준으로 하고 다른 것은 160을 나누면 비례를 얻는다. 우리는 이렇게 본다.
    height = 100 x 480 / 160 = 300px
    width  = 200 x 480 / 160 = 600px
    

    그중 480/160은 사실 기준 비례를 구하는 것이다. 여기서 3을 얻는다.위 표에 익숙한 상황에서 기종의 해상도를 보면 dp를 설정할 때 대응하는 px를 직접 심산할 수 있다. 심산 과정은 다음과 같다.
    해상도: 1080x1920 -> 시스템 DPI: 480 -> 기준 비율: 480/160 = 3 -> 대응 px: 100 x 3 = 300 해상도: 720 x 1280 -> 시스템 DPI: 320 -> 기준 비율: 320/160 = 2 -> 대응 px: 100 x 2 = 200 해상도: 480 x 800 -> 시스템 DPI: 240 -> 기준 비율: 240/160 = 1.5 -> 대응 px: 100 x 1.5 = 150 해상도: 320 x 480 -> 시스템 DPI: 160 ->기준 비율: 160/160 = 1 -> 대응 px: 100 x 1 = 100 해상도: 240x320 -> 시스템 DPI: 120 -> 기준 비율: 120/160 = 0.75 -> 대응 px: 100 x 0.75 = 75...
    요약:
    1.dpi(인치당 픽셀 수)는 미리 설정된 값이 있습니다!120-160-240-320-480.서로 다른 해상도에 대응하다.
    2.벤치마크 = dpi(인치당 픽셀 수)/160
    3.px = dpx 기준 비율
    코드에서 관련 수치 가져오기
    우리가 주로 사용하는 클래스는 DisplayMetrics입니다.
    다음은 공식api 설명 A structure describing general information about a display,such as its size,density,and font scaling.To access the DisplayMetrics members, initialize an object like this:
    DisplayMetrics metrics = newDisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics);
    이것은 화면 정보를 얻는 종류입니다. 예를 들어 크기, 밀도 등입니다.그리고 초기화하는 방법.
    실제 운용은 다음과 같다.
    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    //       DisplayMetrics ,             。              。
    
    dm.ydpi;     //        Y          
    dm.xdpi;     //        X           
                 //ps:                  
                 //                            233333
    
    dm.density;           //           
    dm.densityDpi;        //    dpi,   build.prop          。
    
    dm.widthPixels;       //           
    
    //           !
    //   -          32dp     ,          ,          ,            (px = dp x     )。
    /*    dm.densityDpi / 160       ?
             build.prop         ,         */
    dm.heightPixels + 32 * dm.ydpi / 160;

    좋은 웹페이지 즐겨찾기