[안드로이드] 안드로이드 개발 중 dip, dpi, density, px 등 상세 설명
계산 규칙
우리는 4.95인치 1920* 1080의 넥서스5 휴대전화 설비를 예로 들었다.
Dpi :
Density
위에서 인치당 440픽셀을 얻으면density는 제곱인치당 픽셀 수량으로 445^2=198025이어야 한다.
Dip
안드로이드 시스템 정의 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;
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.