android 获取屏幕宽高

今天在整理工程:

发现项目中有两种获取屏幕宽高的方法:

一、通过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;
}

二、通过WindowManager获取Display,然后在API13之前通过display.getWidth()来获取宽高,单位是px;在API13以前通过display.getSize来获取宽高。

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的尺寸。

这个尺寸会根据当前屏幕的旋转来调整。

通过这个方法返回的尺寸不是必然代表显示的真实的未加工的尺寸(本地分辨率的情况下)。返回的尺寸可能会被某些特定的系统调整,因为这些系统有一些一直显示的特殊的装饰元素。(注:比如可能华为等手机的虚拟键盘的高度可能没有被计算在内。)这个尺寸也会被提供更老的设计在小屏幕的应用的兼容缩放。


结论:如果使用getSize就是第二种,需要在使用的时候减去 status bar 的高度。第一种不用。




补充:
最后,在API17及以上的手机,官方文档还提供了getRealMetrics和getRealSize两个方法。地址:
http://developer.android.com/reference/android/view/Display.html#getRealMetrics(android.util.DisplayMetrics)

这里不做使用,因为android操蛋的碎片化,以及要支持低版本的手机。


getRealMetrics
根据真实的屏幕尺寸得到一个显示的度量。
这个尺寸会根据当前屏幕的旋转来调整。
真实的尺寸可能会小于这个屏幕的物理尺寸,当window manager是效仿更小显示 (using adb shell am display-size)。(这里解释:因为API17出现了应用分屏显示,比如魅族手机,所以返回的是分屏的真实大小,而不是屏幕的大小。)


getRealSize

获取正确的显示尺寸,没有减去任何窗口的装饰(各种状态栏),没有申请任何兼容性的缩放元素。

这个尺寸会根据当前屏幕的旋转来调整。

这个尺寸会根据当前屏幕的旋转来调整。
真实的尺寸可能会小于这个屏幕的物理尺寸,当window manager是效仿更小显示(using adb shell am display-size)。(这里解释:因为API17出现了应用分屏显示,比如魅族手机,所以返回的是分屏的真实大小,而不是屏幕的大小。)



这个尺寸会根据当前屏幕的旋转来调整。

你可能感兴趣的:(android 获取屏幕宽高)