Android 화면 해상도 획득 방법 - 원본 분석
본문http://blog.csdn.net/liuxian13183/ ,인용 은 출처 를 밝 혀 야 합 니 다!
어 울 리 는 과정 에서 우 리 는 화면 너비 가 높 을 때 도 있 습 니 다. 그러면 어떻게 화면의 해상 도 를 얻 습 니까?
방법 은 두 가지 가 있다.
첫 번 째 는 Window Manager 인 터 페 이 스 를 통 해 Diaplay 대상 을 얻 고 디 스 플레이 대상 을 통 해 얻 을 수 있 습 니 다.
WindowManager manager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE); Display display = manager.getDefaultDisplay();
DisplayMetrics outMetrics=new DisplayMetrics(); display.getMetrics(outMetrics);
screenHeight = outMetrics.heightPixels;
screenWidth = outMetrics.widthPixels; //screenHeight = display.getHeight();이 방법 은 폐기 되 었 습 니 다. / screenWidth = display. getWidth ();이 방법 은 이미 폐기 되 었 다.
혹은
원본 코드 를 보면 height 로 말 하면:
private final Point mTmpPoint = new Point();
주로
mTmpPoint 의 y 좌표
public int getHeight() {
synchronized (mTmpPoint) {
long now = SystemClock.uptimeMillis();
if (now > (mLastGetTime+20)) {
getSizeInternal(mTmpPoint, true);
mLastGetTime = now;
}
return mTmpPoint.y;
}
}
그 다음 에 우 리 는 Compatibility Info 대상 을 통 해 metrics 를 설정 하 는 것 이 방법 이 고 다른 하 나 는 getRawHeight () 라 는 것 을 발견 했다.
최종 적 으로 네 이 티 브 방법 으로 밑바닥 을 통 해 이 루어 진다.
방법 2: 리 소스 대상 을 통 해 DisplayMetrics 를 획득
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
screenHeight = metrics.heightPixels; screenWidth = metrics.widthPixels;
전체적으로 디 스 플레이 메 트릭 스 를 얻 으 려 면 그 구성 을 살 펴 보 자.
기본 Density 값
기본 구현 방법:
private void getSizeInternal(Point outSize, boolean doCompat) {
try {
IWindowManager wm = getWindowManager();
if (wm != null) {
wm.getDisplaySize(outSize);
CompatibilityInfo ci;
if (doCompat && (ci=mCompatibilityInfo.getIfNeeded()) != null) {
synchronized (mTmpMetrics) {
mTmpMetrics.noncompatWidthPixels = outSize.x;
mTmpMetrics.noncompatHeightPixels = outSize.y;
mTmpMetrics.density = mDensity;
ci.applyToDisplayMetrics(mTmpMetrics);
outSize.x = mTmpMetrics.widthPixels;
outSize.y = mTmpMetrics.heightPixels;
}
}
} else {
// This is just for boot-strapping, initializing the
// system process before the window manager is up.
outSize.x = getRawWidth();
outSize.y = getRawHeight();
}
if (false) {
RuntimeException here = new RuntimeException("here");
here.fillInStackTrace();
Slog.v(TAG, "Returning display size: " + outSize, here);
}
if (DEBUG_DISPLAY_SIZE && doCompat) Slog.v(
TAG, "Returning display size: " + outSize);
} catch (RemoteException e) {
Slog.w("Display", "Unable to get display size", e);
}
}
일반적으로 아래 방면 을 실현 하여 원 하 는 값 을 얻어 야 한다
자원 류
보다
updateConfiguration(config, metrics);방법.
public int getRawHeight() {
int h = getRawHeightNative();
if (DEBUG_DISPLAY_SIZE) Slog.v(
TAG, "Returning raw display height: " + h);
return h;
}
private native int getRawHeightNative();
/**
* Standard quantized DPI for low-density screens.
*/
public static final int DENSITY_LOW = 120;
/**
* Standard quantized DPI for medium-density screens.
*/
public static final int DENSITY_MEDIUM = 160;
/**
* Standard quantized DPI for 720p TV screens. Applications should
* generally not worry about this density, instead targeting
* {@link #DENSITY_XHIGH} for 1080p TV screens. For situations where
* output is needed for a 720p screen, the UI elements can be scaled
* automatically by the platform.
*/
public static final int DENSITY_TV = 213;
/**
* Standard quantized DPI for high-density screens.
*/
public static final int DENSITY_HIGH = 240;
/**
* Standard quantized DPI for extra-high-density screens.
*/
public static final int DENSITY_XHIGH = 320;
우 리 는 이러한 결 과 를 볼 수 있 기 때문에 Resources 가 형성 되 었 을 때 metrics 는 이미 기록 되 었 다.
그런데 아까 저희 가 사용 한 건 this. getResources 로 직접 얻 은 리 소스 대상 입 니 다.
ContextThemeWrapper:
public void setToDefaults() {
widthPixels = 0;
heightPixels = 0;
density = DENSITY_DEVICE / (float) DENSITY_DEFAULT;
densityDpi = DENSITY_DEVICE;
scaledDensity = density;
xdpi = DENSITY_DEVICE;
ydpi = DENSITY_DEVICE;
noncompatWidthPixels = 0;
noncompatHeightPixels = 0;
}
주로 Context 에서 이 루어 지 는데 구체 적 으로 어떻게 이 루어 지 는 지 는 native 코드 를 봐 야 알 수 있 을 것 같 습 니 다.
화면 해상도 문 제 는 여기까지 소개 하 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.