原文地址:http://blog.csdn.net/aqi00/article/details/50035541


在app编码中经常需要获取手机的屏幕分辨率(宽*高),原来我直接上网拷贝代码,但在使用过程中却发现诸多不便。
不便一:下面代码中的getWidth和getHeight在adt上提示deprecated已经废弃了,实在扎眼

[java]view plaincopy
  1. WindowManagerwm=getWindowManager();
  2. Displaydisplay=wm.getDefaultDisplay();
  3. intscreenWidth=display.getWidth();
  4. intscreenHeight=display.getHeight();


查看android源码说可使用getSize替代,于是换成getSize并把代码提炼到工具类中
[java]view plaincopy
  1. publicstaticPointgetSize(Activityact){
  2. Displaydisplay=act.getWindowManager().getDefaultDisplay();
  3. Pointsize=newPoint();
  4. display.getSize(size);//size.x就是宽度,size.y就是高度
  5. returnsize;
  6. }



用了一阵发现又有不便,原因是getWindowManager方法只能在activity中使用或者被activity实例调用,那像我们在Fragment或者Adapter中想获得屏幕分辨率,又有困难了(因为Fragment和Adapter一般只有Context),虽然可以通过强制类型转换来处理,可是毕竟劳民伤财需要时时记得去转换。所以又改了从Context获取系统服务,然后再去取分辨率,改后的代码如下
[java]view plaincopy
  1. publicstaticPointgetSize(Contextctx){
  2. WindowManagerwm=(WindowManager)ctx.getSystemService(Context.WINDOW_SERVICE);
  3. Displaydisplay=wm.getDefaultDisplay();
  4. Pointsize=newPoint();
  5. display.getSize(size);
  6. returnsize;
  7. }



再后来发现通过DisplayMetrics也能获取分辨率,依网上的做法照猫画虎如下:
[java]view plaincopy
  1. publicstaticPointgetSizeNew(Contextctx){
  2. WindowManagerwm=(WindowManager)ctx.getSystemService(Context.WINDOW_SERVICE);
  3. DisplayMetricsdm=newDisplayMetrics();
  4. wm.getDefaultDisplay().getMetrics(dm);
  5. Pointsize=newPoint();
  6. size.x=dm.widthPixels*dm.density;
  7. size.y=dm.heightPixels*dm.density;
  8. returnsize;
  9. }



不久便发现这个新方法时常量错了,找来找去又自己反复实践,结果确认widthPixels和heightPixels就是宽和高,无需再乘上density。因为widthPixels和heightPixels的单位都是像素,而density指的是像素密度,即一个单位内有几个像素,所以在我这边乘上density没有意义,只有除以density才有意义。dm.widthPixels/dm.density指的是宽度上有多少单位,dm.heightPixels/dm.density指的是高度上有多少单位。网上乘以density的做法,可能只是他们恰好遇上部分特殊机型罢了。最后的代码如下:
[java]view plaincopy
  1. publicstaticPointgetSizeNew(Contextctx){
  2. WindowManagerwm=(WindowManager)ctx.getSystemService(Context.WINDOW_SERVICE);
  3. DisplayMetricsdm=newDisplayMetrics();
  4. wm.getDefaultDisplay().getMetrics(dm);
  5. Pointsize=newPoint();
  6. size.x=dm.widthPixels;
  7. size.y=dm.heightPixels;
  8. returnsize;
  9. }

更多相关文章

  1. Android代码性能优化技巧
  2. Android公钥私钥及代码详细解读
  3. android OSChina 客户端源代码剖析
  4. android代码混淆 GSON完满解决
  5. Android开源代码解读の地图照片应用Panoramio的实现详解(六)
  6. 在app引擎端点的启动时执行代码
  7. javaScript函数中执行C#代码中的函数
  8. 反编译APK 得到JAVA代码和资源文件源码
  9. java.io.File vs java.nio.Files这是新代码中的首选?

随机推荐

  1. Android 分享功能
  2. android 随笔提示
  3. Android Dialog
  4. Android java.lang.IllegalArgumentExcep
  5. 使用Android Studio时报错 Manifest merg
  6. 使Android原生时间选择器样式为滚轮
  7. android_9 Intent 基础
  8. Android 判断网络连接
  9. 2014.04.21 ——— android 魅族SmartBar
  10. Android获取本地图片之ACTION_GET_CONTEN