Android开发:获取屏幕宽和高的两种方法(px、dip、分辨率之间的关系及px与dip互相转化)

获取屏幕宽和高的两种方法

方法一、代码如下:
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1.        WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);  
  2.         Display display = wm.getDefaultDisplay();  
  3.         Log.i(tag, "屏幕尺寸1: 宽度 = "+display.getWidth()+"高度 = :"+display.getHeight()  
  4.                 );

方法二、代码如下:
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. DisplayMetrics dm =getResources().getDisplayMetrics();  
  2.         int w_screen = dm.widthPixels;  
  3.         int h_screen = dm.heightPixels;  
  4.         Log.i(tag, "屏幕尺寸2:宽度 = " + w_screen + "高度 = " + h_screen + "密度 = " + dm.densityDpi);

方法一的方法已经被遗弃了,推荐用方法2的方法,除获得屏幕的宽和高外还可以获得屏幕的密度。这里必须注意,获得的尺寸单位为px,即像素,而不是屏幕的绝对尺寸。在G700上得到的参数如下:
[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1.  Line 1297: 12-08 11:39:09.037 I/yan     (13602): 屏幕尺寸1: 宽度 = 720高度 = :1280  
  2.     Line 1299: 12-08 11:39:09.037 I/yan     (13602): 屏幕尺寸2:宽度 = 720高度 = 1280密度 = 320

在Geek手机上参数如下:
[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. Line 1511: 01-06 03:11:20.839 I/yan     (30175): 屏幕尺寸1: 宽度 = 1080高度 = :1920  
  2. Line 1513: 01-06 03:11:20.839 I/yan     (30175): 屏幕尺寸2:宽度 = 1080高度 = 1920密度 = 480

可以看到,同样是5.0寸的屏幕,一个密度是320,一个密度是480.同样的物理宽度,后者是1080个像素而前者是720个像素。

px与dip的概念及互相转化

px即pixels,是绝对像素,有多少个像素点就是多少个像素点。
dip即device independent pixel,设备独立像素,无像素无关。
二者转换公式如下:
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. package org.yanzi.util;  
  2. import android.content.Context;  
  3.   
  4. public class DisplayUtil {  
  5.     public static int dip2px(Context context, float dipValue){              
  6.         final float scale = context.getResources().getDisplayMetrics().density;                   
  7.         return (int)(dipValue * scale + 0.5f);           
  8.     }              
  9.     public static int px2dip(Context context, float pxValue){                  
  10.         final float scale = context.getResources().getDisplayMetrics().density;                   
  11.         return (int)(pxValue / scale + 0.5f);           
  12.     }   
  13. }  
转换时牵涉到一个密度的概念,密度越大,单位物理尺寸上的像素点就越多,dip也就越大。从转换公式上也可以看到,px近似等于dip*density。dip跟dp一个意思,在android开发中推荐像素使用dip概念。举个简单的例子,如果扫描矩形框的长度为300px,在density为320和480的手机屏幕上显示效果是完全不一样的,因此单位要使用dip。但是在使用canvas绘制东西时,所依照的坐标系、Rect等单位都是px,所以其尺寸要以dip为单位,而坐标要以px为单位。假设要以屏幕的中心为正方形的中心,画一个边长为D的正方形,设D = 240dip. 代码如下:
[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. Point center_dip = new Point(DisplayUtil.px2dip(this, dm.widthPixels)/2,  
  2.                 DisplayUtil.px2dip(this, dm.heightPixels)/2); //以dip为单位的中心  
  3.   
  4.         square_screen = new Rect(DisplayUtil.dip2px(this, center_dip.x - D/2),  
  5.                 DisplayUtil.dip2px(this,center_dip.y - D/2),  
  6.                 DisplayUtil.dip2px(this,center_dip.x + D/2),  
  7.                 DisplayUtil.dip2px(this,center_dip.y + D/2));
首先得到dip为单位的屏幕中心,然后以D(单位dip)得到单位为dip的正常性坐标,再将其转换成单位为px的坐标,这样在不同的手机上显示效果就是一样的。其实可以这么看待dip,dip有点类似手机的物理尺寸,尽管实际上不是。dip = px/density,geek 5.0寸屏跟G700,得到的结果是一样的:1080/3 = 720/2

总结:
densityDpi 每英寸多少个像素点,(像素点的算法为:240(分辨率手机为240*320)/1.5(屏幕宽1.5高2.0即3寸手机)=160dpi(横向))
density =  densityDpi /160 (密度)
APP根据densityDpi的大小决定调用哪个文件夹下的图片,关系如下:
drawable-ldpi 底密度,通常是指120 (密度为1.5)
drawable-mdpi 中等密度,通常是指160(密度为1)
drawable-xhdpi 超高密度,通常是指320 (密度为2,目前主流手机密度,)

px = dip*density 
在绘制矩形时,可以首先获得屏幕宽度的dip,根据dip决定边长D,然后用文中的方法确定其px坐标。来张效果图:


不同的手机/平板可能具有不同的像素密度,例如同为4寸手机,有480x320分辨率的也有800x480分辨率的,前者的像素密度就比较低。Android系统定义了四种像素密度:低(120dpi)、中(160dpi)、高(240dpi)和超高(320dpi),它们对应的dp到px的系数分别为0.75、1、1.5和2,这个系数乘以dp长度就是像素数。例如界面上有一个长度为“80dp”的图片,那么它在240dpi的手机上实际显示为80x1.5=120px,在320dpi的手机上实际显示为80x2=160px。如果你拿这两部手机放在一起对比,会发现这个图片的物理尺寸“差不多”,这就是使用dp作为单位的效果,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值