• Android 获取屏幕尺寸与密度


    android中获取屏幕的长于宽,參考了网上有非常多代码,但结果与实际不符,如我的手机是i9000,屏幕大小是480*800px,得到的结果却为320*533

    结果非常不靠谱,于是自己写了几行代码,亲測一下

    測试參数:

    測试环境: i9000(三星)

    物理屏幕:480*800px

    density :1.5

    測试代码:

    1. // 获取屏幕密度(方法1)  
    2. int screenWidth  = getWindowManager().getDefaultDisplay().getWidth();       // 屏幕宽(像素,如:480px)  
    3. int screenHeight = getWindowManager().getDefaultDisplay().getHeight();      // 屏幕高(像素,如:800p)  
    4.   
    5. Log.e(TAG + "  getDefaultDisplay""screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);  
    6.   
    7.   
    8. // 获取屏幕密度(方法2)  
    9. DisplayMetrics dm = new DisplayMetrics();  
    10. dm = getResources().getDisplayMetrics();  
    11.   
    12. float density  = dm.density;        // 屏幕密度(像素比例:0.75/1.0/1.5/2.0)  
    13. int densityDPI = dm.densityDpi;     // 屏幕密度(每寸像素:120/160/240/320)  
    14. float xdpi = dm.xdpi;             
    15. float ydpi = dm.ydpi;  
    16.   
    17. Log.e(TAG + "  DisplayMetrics""xdpi=" + xdpi + "; ydpi=" + ydpi);  
    18. Log.e(TAG + "  DisplayMetrics""density=" + density + "; densityDPI=" + densityDPI);  
    19.   
    20. screenWidth  = dm.widthPixels;      // 屏幕宽(像素,如:480px)  
    21. screenHeight = dm.heightPixels;     // 屏幕高(像素,如:800px)  
    22.   
    23. Log.e(TAG + "  DisplayMetrics(111)""screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);  
    24.   
    25.   
    26.   
    27. // 获取屏幕密度(方法3)  
    28. dm = new DisplayMetrics();  
    29. getWindowManager().getDefaultDisplay().getMetrics(dm);  
    30.   
    31. density  = dm.density;      // 屏幕密度(像素比例:0.75/1.0/1.5/2.0)  
    32. densityDPI = dm.densityDpi;     // 屏幕密度(每寸像素:120/160/240/320)  
    33. xdpi = dm.xdpi;           
    34. ydpi = dm.ydpi;  
    35.   
    36. Log.e(TAG + "  DisplayMetrics""xdpi=" + xdpi + "; ydpi=" + ydpi);  
    37. Log.e(TAG + "  DisplayMetrics""density=" + density + "; densityDPI=" + densityDPI);  
    38.   
    39. int screenWidthDip = dm.widthPixels;        // 屏幕宽(dip,如:320dip)  
    40. int screenHeightDip = dm.heightPixels;      // 屏幕宽(dip,如:533dip)  
    41.   
    42. Log.e(TAG + "  DisplayMetrics(222)""screenWidthDip=" + screenWidthDip + "; screenHeightDip=" + screenHeightDip);  
    43.   
    44. screenWidth  = (int)(dm.widthPixels * density + 0.5f);      // 屏幕宽(px,如:480px)  
    45. screenHeight = (int)(dm.heightPixels * density + 0.5f);     // 屏幕高(px,如:800px)  
    46.   
    47. Log.e(TAG + "  DisplayMetrics(222)""screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);  

    结果例如以下:

    1. E/== MyScreenActivity ===================================  getDefaultDisplay( 8509): screenWidth=320; screenHeight=533  
    2. E/== MyScreenActivity ===================================  DisplayMetrics( 8509): xdpi=156.3077; ydpi=157.51938  
    3. E/== MyScreenActivity ===================================  DisplayMetrics( 8509): density=1.0; densityDPI=160  
    4. E/== MyScreenActivity ===================================  DisplayMetrics(111)( 8509): screenWidth=320; screenHeight=533  
    5. E/== MyScreenActivity ===================================  DisplayMetrics( 8509): xdpi=234.46153; ydpi=236.27907  
    6. E/== MyScreenActivity ===================================  DisplayMetrics( 8509): density=1.5; densityDPI=240  
    7. E/== MyScreenActivity ===================================  DisplayMetrics(222)( 8509): screenWidthDip=320; screenHeightDip=533  
    8. 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" />


    可是,这就说明方法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清单文件详解(四) ---- backupAgent的用法
    Android清单文件详解(一) ---- 一切从<manifest>开始
    Android OpenGL ES(九)----构建几何物体
    Android OpenGL ES(八)----纹理编程框架
    Android OpenGL ES(七)----理解纹理与纹理过滤
    Android OpenGL ES(六)----进入三维在代码中创建投影矩阵和旋转矩阵
    Android OpenGL ES(五)----进入三维正交投影和透视投影推导
    Android OpenGL ES(四)----调整屏幕的宽高比
    获取验证码按钮点击后,一分钟内不可继续点击
    选择本地图片后,上传前显示在界面上,实现实时预览
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3758925.html
Copyright © 2020-2023  润新知