zoukankan      html  css  js  c++  java
  • Android初级教程:屏幕分辨率

    在app编码中经常需要获取手机的屏幕分辨率(宽*高),原来我直接上网拷贝代码,但在使用过程中却发现诸多不便。

    不便一:下面代码中的getWidth和getHeight在adt上提示deprecated已经废弃了,实在扎眼

    WindowManager wm = getWindowManager();      
    Display display = wm.getDefaultDisplay();     
    int screenWidth = display.getWidth();      
    int screenHeight = display.getHeight(); 


    查看android源码说可使用getSize替代,于是换成getSize并把代码提炼到工具类中


        public static Point getSize(Activity act) {  
            Display display = act.getWindowManager().getDefaultDisplay();  
            Point size = new Point();  
            display.getSize(size);  //size.x就是宽度,size.y就是高度  
            return size;  
        }  

    用了一阵发现又有不便,原因是getWindowManager方法只能在activity中使用或者被activity实例调用,那像我们在Fragment或者Adapter中想获得屏幕分辨率,又有困难了(因为Fragment和Adapter一般只有Context),虽然可以通过强制类型转换来处理,可是毕竟劳民伤财需要时时记得去转换。所以又改了从Context获取系统服务,然后再去取分辨率,改后的代码如下


        public static Point getSize(Context ctx) {  
            WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);  
            Display display = wm.getDefaultDisplay();  
            Point size = new Point();  
            display.getSize(size);  
            return size;  
        }  

    再后来发现通过DisplayMetrics也能获取分辨率,依网上的做法照猫画虎如下:


        public static Point getSizeNew(Context ctx) {  
            WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);  
            DisplayMetrics dm = new DisplayMetrics();  
            wm.getDefaultDisplay().getMetrics(dm);  
            Point size = new Point();  
            size.x = dm.widthPixels*dm.density;  
            size.y = dm.heightPixels*dm.density;  
            return size;  
        }  

    不就便发现这个新方法时常量错了,找来找去又自己反复实践,结果确认widthPixels和heightPixels就是宽和高,无需再乘上density。因为widthPixels和heightPixels的单位都是像素,而density指的是像素密度,即一个单位内有几个像素,所以在我这边乘上density没有意义,只有除以density才有意义。dm.widthPixels/dm.densit指的是宽度上有多少单位,dm.heightPixels/dm.density指的是高度上有多少单位。网上乘上density的做法,可能只是他们恰好遇上部分特殊机型罢了。最后的代码如下


        public static Point getSizeNew(Context ctx) {  
            WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);  
            DisplayMetrics dm = new DisplayMetrics();  
            wm.getDefaultDisplay().getMetrics(dm);  
            Point size = new Point();  
            size.x = dm.widthPixels;  
            size.y = dm.heightPixels;  
            return size;  
        }  


  • 相关阅读:
    现状和措施
    Nginx http升级到https
    搭建 git 服务器
    Vue + Springboot 开发的简单的用户管理系统
    Vue中的button事件
    Mvc多级Views目录 asp.net mvc4 路由重写及 修改view 的寻找视图的规则
    asp.net mvc 多级目录结构
    Asp.net下使用HttpModule模拟Filter,实现权限控制
    JavaScript事件冒泡简介及应用
    Rhino Mock
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299626.html
Copyright © 2011-2022 走看看