今天在整理工程:
发现项目中有两种获取屏幕宽高的方法:
一、通过WindowManager获取Display,通过display获取Metrics,通过Metrics获取宽高。最后的单位是px。
public static final int getScreenWidth() {
Context context = XManager.getManager().getApplication().getApplicationContext();
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics metric = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels;
return width;
}
public static int[] getScreenWidth (Context context) {
int width;
Display display;
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
display = wm.getDefaultDisplay();
if (android.os.Build.VERSION.SDK_INT >= 13) {
Point size = new Point();
display.getSize(size);
width = size.x;
} else {
width = display.getWidth();
}
return width;
}
关键都在Display这个类,来看看官方的解释:地址:http://developer.android.com/reference/android/view/Display.html
第一份代码对应的
英文翻译如下:
getMetrics(DisplayMetrics outMEtrics):
得到一个显示的度量,用来描述这个显示尺寸和密度的。(注:这个显示就是传入的参数outMetrics)
这个尺寸会根据当前屏幕的旋转来调整。
通过这个方法返回的尺寸不是必然代表显示的真实的未加工的尺寸(本地分辨率的情况下)。返回的尺寸可能会被某些特定的系统调整,因为这些系统有一些一直显示的特殊的装饰元素。(注:比如可能华为等手机的虚拟键盘的高度可能没有被计算在内。)这个尺寸也会被提供更老的设计在小屏幕的应用的兼容缩放。
第二份代码对应的
英文翻译如下:
getWidth()
这个方法在API13之后废弃了,使用getSize(Point)代替
getSize(Point outSize)
获得一个显示的尺寸,单位px
注意这个值不应该被用来计算布局,因为一个设备会有特色的拥有屏幕装饰(比如status bar),沿着显示的边缘减少大部分应用的显示空间,布局应该使用window的尺寸。
这个尺寸会根据当前屏幕的旋转来调整。
通过这个方法返回的尺寸不是必然代表显示的真实的未加工的尺寸(本地分辨率的情况下)。返回的尺寸可能会被某些特定的系统调整,因为这些系统有一些一直显示的特殊的装饰元素。(注:比如可能华为等手机的虚拟键盘的高度可能没有被计算在内。)这个尺寸也会被提供更老的设计在小屏幕的应用的兼容缩放。
getRealSize
获取正确的显示尺寸,没有减去任何窗口的装饰(各种状态栏),没有申请任何兼容性的缩放元素。
这个尺寸会根据当前屏幕的旋转来调整。
这个尺寸会根据当前屏幕的旋转来调整。
真实的尺寸可能会小于这个屏幕的物理尺寸,当window manager是效仿更小显示(using adb shell am display-size)。(这里解释:因为API17出现了应用分屏显示,比如魅族手机,所以返回的是分屏的真实大小,而不是屏幕的大小。)