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=533E/== MyScreenActivity ===================================  DisplayMetrics( 8509): xdpi=156.3077; ydpi=157.51938E/== MyScreenActivity ===================================  DisplayMetrics( 8509): density=1.0; densityDPI=160E/== MyScreenActivity ===================================  DisplayMetrics(111)( 8509): screenWidth=320; screenHeight=533E/== MyScreenActivity ===================================  DisplayMetrics( 8509): xdpi=234.46153; ydpi=236.27907E/== MyScreenActivity ===================================  DisplayMetrics( 8509): density=1.5; densityDPI=240E/== MyScreenActivity ===================================  DisplayMetrics(222)( 8509): screenWidthDip=320; screenHeightDip=533E/== 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之间,例如


但是,这就说明方法3一定是通用的吗?

回答是否定的,因为我也在模拟器、HTC G14物理机,以及ViewSonic、Galaxy平板上测试过,方法3在density=1.5时,放大了实际屏幕值,例如:HTC G14

在HTC G14上,实际屏幕大小,直接通过dm.widthPixels、dm.heightPixels便得到了实际物理屏幕大小(540,960)

导致无法通过一种通用的方法获取真实物理屏幕大小的原因,可能就是因为Android系统开源,不同的手机生产厂商没有统一的制造标准,来规定手机屏幕。


仔细分析代码,发现问题出在代码:

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.


测试源码



参考推荐:

Android的计量单位px,in,mm,pt,dp,dip,sp


更多相关文章

  1. Android热补丁技术—dexposed原理简析(阿里Hao)
  2. android里面intent的简单用法
  3. 关于Android的一些设计
  4. Android(安卓)设备root 原理及方法
  5. Qt on Android:应用截屏
  6. Android基础 : Android(安卓)Service
  7. Android(安卓)Service生命周期及用法
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Android(安卓)了解Activity
  2. Android(安卓)应用程序建立与WMS服务之间
  3. Android(安卓)MVC模式
  4. Android(安卓)最优轮循(心跳策略)探究实践
  5. Android(安卓)多线程编程
  6. Android在智能手机关键市场扩大份额优势
  7. Android(安卓)4.4 打印探究
  8. Android(安卓)的属性系统(翻译)
  9. 动手学Android之四——布局初步(一)
  10. Android性能优化之一:ViewStub(转)