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 코드 를 봐 야 알 수 있 을 것 같 습 니 다.
화면 해상도 문 제 는 여기까지 소개 하 겠 습 니 다.

좋은 웹페이지 즐겨찾기