原创文章,禁止复制,需要引用需指定原文。
只有activity可以使用WindowManager,否则应该使用Context.getResources().getDisplayMetrics()来获取。
Activity中设置DM:
DisplayMetrics dm =newDisplayMetrics(); WindowManager manager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); manager.getDefaultDisplay().getMetrics(dm);
手机屏幕参数与实际屏幕参数是不一样的。
Context.getResources().getDisplayMetrics()依赖于手机系统,获取到的是系统的屏幕信息;
WindowManager.getDefaultDisplay().getMetrics(dm)是获取到Activity的实际屏幕信息。
manager.getDefaultDisplay().getMetrics(dm)---app的:
/** * Gets display metrics that describe the size and density of this display. * <p> * The size is adjusted based on the current rotation of the display. * </p><p> * The size returned by this method does not necessarily represent the * actual raw size (native resolution) of the display. The returned size may * be adjusted to exclude certain system decor elements that are always visible. * It may also be scaled to provide compatibility with older applications that * were originally designed for smaller displays. * </p> * * @param outMetrics A {@link DisplayMetrics} object to receive the metrics. */ public void getMetrics(DisplayMetrics outMetrics) { synchronized (this) { updateDisplayInfoLocked(); mDisplayInfo.getAppMetrics(outMetrics, mDisplayAdjustments); } }
从源码的方法名可知,这个Metric是依赖于App的。
getResources().getDisplayMetrics()---系统的:
/** * Return the current display metrics that are in effect for this resource * object. The returned object should be treated as read-only. * * @return The resource's current display metrics. */ public DisplayMetrics getDisplayMetrics() { if (DEBUG_CONFIG) Slog.v(TAG, "Returning DisplayMetrics: " + mMetrics.widthPixels + "x" + mMetrics.heightPixels + " " + mMetrics.density); return mMetrics; }final DisplayMetrics mMetrics = new DisplayMetrics(); public Resources(AssetManager assets, DisplayMetrics metrics, Configuration config, CompatibilityInfo compatInfo, IBinder token) { mAssets = assets; mMetrics.setToDefaults(); if (compatInfo != null) { mCompatibilityInfo = compatInfo; } mToken = new WeakReference<IBinder>(token); updateConfiguration(config, metrics); assets.ensureStringBlocks(); } 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 = widthPixels; noncompatHeightPixels = heightPixels; noncompatDensity = density; noncompatDensityDpi = densityDpi; noncompatScaledDensity = scaledDensity; noncompatXdpi = xdpi; noncompatYdpi = ydpi; }
上面mMetrics在之后还有方法设置系统手机屏幕的值。
