Android初级教程:屏幕分辨率

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

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

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. WindowManager wm = getWindowManager();        
  2. Display display = wm.getDefaultDisplay();       
  3. int screenWidth = display.getWidth();        
  4. int screenHeight = display.getHeight();   


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


[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public static Point getSize(Activity act) {    
  2.     Display display = act.getWindowManager().getDefaultDisplay();    
  3.     Point size = new Point();    
  4.     display.getSize(size);  //size.x就是宽度,size.y就是高度    
  5.     return size;    
  6. }    

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


[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public static Point getSize(Context ctx) {    
  2.     WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);    
  3.     Display display = wm.getDefaultDisplay();    
  4.     Point size = new Point();    
  5.     display.getSize(size);    
  6.     return size;    
  7. }    

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


[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public static Point getSizeNew(Context ctx) {    
  2.     WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);    
  3.     DisplayMetrics dm = new DisplayMetrics();    
  4.     wm.getDefaultDisplay().getMetrics(dm);    
  5.     Point size = new Point();    
  6.     size.x = dm.widthPixels*dm.density;    
  7.     size.y = dm.heightPixels*dm.density;    
  8.     return size;    
  9. }    

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


[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public static Point getSizeNew(Context ctx) {    
  2.     WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);    
  3.     DisplayMetrics dm = new DisplayMetrics();    
  4.     wm.getDefaultDisplay().getMetrics(dm);    
  5.     Point size = new Point();    
  6.     size.x = dm.widthPixels;    
  7.     size.y = dm.heightPixels;    
  8.     return size;    
  9. }    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值