DisplayMetrics的metrics最终哪里赋值的
时间: 2024-03-28 10:36:43 浏览: 21
在Android中,DisplayMetrics类的实例是由WindowManagerService在系统启动时创建并初始化的。当创建一个新的SurfaceFlinger会话时,WindowManagerService创建一个新的Display,并将Display的参数填充到DisplayInfo结构中,然后将DisplayInfo传递给SurfaceFlinger。而DisplayMetrics结构则是在SurfaceFlinger中用于计算和调整Surface大小和位置的一个关键参数。
在应用程序中,可以通过Context对象的getResources()方法获取到当前设备的DisplayMetrics对象。这个方法内部会调用WindowManagerService的getDisplayMetrics()方法,该方法会将DisplayMetrics对象的字段填充为当前设备的参数值。
总的来说,DisplayMetrics的metrics最终是由WindowManagerService在系统启动时创建并初始化的,应用程序可以通过Context对象获取到已经初始化的DisplayMetrics对象。
相关问题
private int getCurrentSwDp() { final Resources res = getContext().getResources(); final DisplayMetrics metrics = res.getDisplayMetrics(); final float density = metrics.density; final int minDimensionPx = Math.min(metrics.widthPixels, metrics.heightPixels); return (int) (minDimensionPx / density); }
这是一个 Android 应用程序中的方法,用于获取当前屏幕的最小宽度(sw)的值,以便根据屏幕大小和密度进行自适应布局。该方法使用了 Android 的 DisplayMetrics 类来获取屏幕的宽度和高度(以像素为单位),然后通过除以屏幕密度(以 dpi 为单位)来将像素转换为 dp。最后,方法返回屏幕最小宽度的值,以 dp 为单位。
final Resources res = getContext().getResources(); final DisplayMetrics metrics = res.getDisplayMetrics(); final int newSwDp = Math.max(Integer.parseInt(getText()), 320); final int minDimensionPx = Math.min(metrics.widthPixels, metrics.heightPixels); final int newDensity = DisplayMetrics.DENSITY_MEDIUM * minDimensionPx / newSwDp; final int densityDpi = Math.max(newDensity, 120); DisplayDensityConfiguration.setForcedDisplayDensity(Display.DEFAULT_DISPLAY, densityDpi);
这代码是用于在 Android 平台上设置显示密度的。它首先获取应用程序的 `Resources` 对象,然后使用该对象获取当前设备的显示度量信息 `DisplayMetrics`。接下来,它根据用户输入的值计算新的屏幕宽度 `newSwDp`,这里使用了 `Math.max` 方法来确保新的屏幕宽度不小于 320。然后,它计算新的密度 `newDensity`,这里使用了 `DisplayMetrics.DENSITY_MEDIUM` 常量来表示中等密度,然后根据新的屏幕宽度和最小宽度计算得出新的密度。最后,它使用 `Math.max` 方法来确保新的密度不小于 120,并将新的密度设置到 `DisplayDensityConfiguration` 类中的 `forcedDisplayDensity` 属性中,以强制应用程序使用指定的显示密度。
需要注意的是,这段代码可能会抛出 `NumberFormatException` 异常,如果用户输入的不是数字字符串时,将无法解析该字符串并导致该异常。此外,这里设置的密度值仅适用于当前应用程序,并不会影响其他应用程序或系统级别的界面元素。