android中获取屏幕的长于宽,参考了网上有很多代码,但结果与实际不符,如我的手机是i9000,屏幕大小是480*800px,得到的结果却为320*533
结果很不靠谱,于是自己写了几行代码,亲测一下
测试参数:
测试环境: i9000(三星)
物理屏幕:480*800px
density :1.5
测试代码:
?
- //?获取屏幕密度(方法1)??
- int?screenWidth??=?getWindowManager().getDefaultDisplay().getWidth();???????//?屏幕宽(像素,如:480px)??
- int?screenHeight?=?getWindowManager().getDefaultDisplay().getHeight();??????//?屏幕高(像素,如:800p)??
- ??
- Log.e(TAG?+?"??getDefaultDisplay",?"screenWidth="?+?screenWidth?+?";?screenHeight="?+?screenHeight);??
- ??
- ??
- //?获取屏幕密度(方法2)??
- DisplayMetrics?dm?=?new?DisplayMetrics();??
- dm?=?getResources().getDisplayMetrics();??
- ??
- float?density??=?dm.density;????????//?屏幕密度(像素比例:0.75/1.0/1.5/2.0)??
- int?densityDPI?=?dm.densityDpi;?????//?屏幕密度(每寸像素:120/160/240/320)??
- float?xdpi?=?dm.xdpi;?????????????
- float?ydpi?=?dm.ydpi;??
- ??
- Log.e(TAG?+?"??DisplayMetrics",?"xdpi="?+?xdpi?+?";?ydpi="?+?ydpi);??
- Log.e(TAG?+?"??DisplayMetrics",?"density="?+?density?+?";?densityDPI="?+?densityDPI);??
- ??
- screenWidth??=?dm.widthPixels;??????//?屏幕宽(像素,如:480px)??
- screenHeight?=?dm.heightPixels;?????//?屏幕高(像素,如:800px)??
- ??
- Log.e(TAG?+?"??DisplayMetrics(111)",?"screenWidth="?+?screenWidth?+?";?screenHeight="?+?screenHeight);??
- ??
- ??
- ??
- //?获取屏幕密度(方法3)??
- dm?=?new?DisplayMetrics();??
- getWindowManager().getDefaultDisplay().getMetrics(dm);??
- ??
- density??=?dm.density;??????//?屏幕密度(像素比例:0.75/1.0/1.5/2.0)??
- densityDPI?=?dm.densityDpi;?????//?屏幕密度(每寸像素:120/160/240/320)??
- xdpi?=?dm.xdpi;???????????
- ydpi?=?dm.ydpi;??
- ??
- Log.e(TAG?+?"??DisplayMetrics",?"xdpi="?+?xdpi?+?";?ydpi="?+?ydpi);??
- Log.e(TAG?+?"??DisplayMetrics",?"density="?+?density?+?";?densityDPI="?+?densityDPI);??
- ??
- int?screenWidthDip?=?dm.widthPixels;????????//?屏幕宽(dip,如:320dip)??
- int?screenHeightDip?=?dm.heightPixels;??????//?屏幕宽(dip,如:533dip)??
- ??
- Log.e(TAG?+?"??DisplayMetrics(222)",?"screenWidthDip="?+?screenWidthDip?+?";?screenHeightDip="?+?screenHeightDip);??
- ??
- screenWidth??=?(int)(dm.widthPixels?*?density?+?0.5f);??????//?屏幕宽(px,如:480px)??
- screenHeight?=?(int)(dm.heightPixels?*?density?+?0.5f);?????//?屏幕高(px,如:800px)??
- ??
- Log.e(TAG?+?"??DisplayMetrics(222)",?"screenWidth="?+?screenWidth?+?";?screenHeight="?+?screenHeight);??
结果如下:
?
- E/==?MyScreenActivity?===================================??getDefaultDisplay(?8509):?screenWidth=320;?screenHeight=533??
- E/==?MyScreenActivity?===================================??DisplayMetrics(?8509):?xdpi=156.3077;?ydpi=157.51938??
- E/==?MyScreenActivity?===================================??DisplayMetrics(?8509):?density=1.0;?densityDPI=160??
- E/==?MyScreenActivity?===================================??DisplayMetrics(111)(?8509):?screenWidth=320;?screenHeight=533??
- E/==?MyScreenActivity?===================================??DisplayMetrics(?8509):?xdpi=234.46153;?ydpi=236.27907??
- E/==?MyScreenActivity?===================================??DisplayMetrics(?8509):?density=1.5;?densityDPI=240??
- E/==?MyScreenActivity?===================================??DisplayMetrics(222)(?8509):?screenWidthDip=320;?screenHeightDip=533??
- E/==?MyScreenActivity?===================================??DisplayMetrics(222)(?8509):?screenWidth=480;?screenHeight=800??
?
?
分析结果:?
在onDraw()方法中
方法1和2,得到的结果都一致,均为320*533,明显不是测试机i9000的屏幕大小
方法3,将方法1和2得到的结果,乘以density后,完美的480*800,perfect!
注:?density 大于1的情况下,需要设置targetSdkVersion在4-9之间,例如
<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="10" />
仔细分析代码,发现问题出在代码:
getWindowManager().getDefaultDisplay().getMetrics(dm)
Initialize a DisplayMetrics?object from this display's data.
?
dm = getResources().getDisplayMetrics()
Return the?current display metrics?that are in effect for this resource object. The returned object should be treated as read-only.