android dpi dip px

本文转载自:http://blog.csdn.net/zhaokaiqiang1992


mdpi 120dpi~160dpi 
hdpi 160dpi~240dpi 
xhdpi 240dpi~320dpi 
xxhdpi 320dpi~480dpi 
xxxhdpi 480dpi~640dpi 

首先Drawable资源分为xxhdpi,xhdpi,hdpi,mdpi,ldpi,分别为超超高密度400dpi(左右),超高密度320dpi,高密度240dpi,中密度160dpi,低密度120dpi。

然后手机的屏幕又分为FWVGA,WVGA,VGA,HVGA,QVGA,其中

  •     VGA是:Video Graphic Array,显示标准为480 x 640;
  •     WVGA是Wide VGA,分辨率为480 x 800;
  •     FWVGA是Full Wide VGA,分辨率为:480 x 854;
  •     HVGA是Half VGA,分辨率为:320 x 480;
  •     QVGA是Quarter VGA,分辨率为:240 x 320;
  1. xxhdpi:主要存放超超高密度图片,背景图:1080 x 1920,Icon:144 x 144,适配机型:谷歌 Nexus 4
  2. xhdpi:主要存放超高密度图片,背景图:720 x 1280,Icon:96 x 96,适配机型:小米2等大屏手机
  3. hdpi:主要放高密度图片:背景图:480 x 800,Icon:72 x 72,适配机型:WVGA(480 x 800)和FWVGA(480 x 854)
  4. mdpi:主要放中密度图片:背景图 :320 x 480,Icon:48 x 48,适配机型:HVGA(320 x 480)
  5. ldpi:主要放低密度图片:背景图:240 x 320,Icon:36 x 36,适配机型:QVGA(240 x 320)

分辨率,这个在android平台上异常麻烦的问题,让很多新手要崩溃了。今天,我想和分辨率这个家伙谈谈。

    首先,什么是分辨率呢?我们通常说的480*800、1280*720等等,就是所谓的手机屏幕的分辨率。分辨率代表的是整个屏幕上,一共有多少个像素点,也就是在ps或者是其他的图像编辑软件中的px的概念。美工在帮我们做高清原型图的时候,一般会按照多少分辨率来做。这里提醒一下刚入职的新手,android版本的高清原型图最好选择1280*720像素,这样美工在后期的切图的时候会比较容易。目前的项目因为分辨率选择的是480*800,所以在后期做高分辨率适配的时候,有很多的小图标需要重做,否则显示效果很模糊,这无形之中加大了UI设计师的工作量,算是一个教训吧!

    但是呢,我们开发者在用xml写界面的时候,可不会直接用px做为单位,这是因为在不同的分辨率下面,相同显示效果的界面上,控件的实际像素并不是一样的,因此,我们在设置控件大小的时候,一般用的是dip(dp)作为长度单位,那么,dip到底是一种什么单位呢?

    dip是Density independent pixel的缩写,也就是独立的像素密度的意思,dip是基于屏幕密度的抽象单位,与设备无关,用于说明与密度无关的尺寸和位置。它是相对于一个160dpi的屏幕来说的,因此1dip对应160dpi屏幕上的1px。

    这里一定要注意,dip和dpi是截然不同的两个概念,不要弄混。

    dip指的是一种独立像素的表示方式,它的计算是在dpi的基础之上的,也就是说,我们只有在知道dpi是多少之后,才能够根据不同的dpi,来精确计算我们需要的dip。

    dpi是一种密度单位,是dot per inch的缩写,也就是每英寸多少个像素点的意思。比如说,我们有一个480*800分辨率的手机,屏幕的物理尺寸是3英寸*5英寸,那么我们就可以计算出这个手机的是480/3=160dpi,是属于低分辨率的,那么在这种分辨率下面,一个dip就相当于1px,怎么计算呢?当然就是1dip*(160/160)=1px。也就是说,当我们在这种分辨率的手机下,控件的宽度和长度就和设计图一样大小就可以,一个dip对应一个px。但是,如果还是相同的分辨率,换成了2英寸*3.3英寸呢?那么我们就可以先算出手机的密度是480/2=240dpi,是属于高分辨率的,那么在这种分辨率下面,一个dip就相当于1.5像素,怎么计算呢?当然还是1dip*(240/160)=1.5px。

    因此,明白了dip和dpi的关系,我们就可以精确的设定控件的大小。

    具体而言,当屏幕的的分辨率为320x480时,无论实际的物理尺寸大小,密度都会被设置为160dpi,也就意味着这个设备上,一行最多可以放置320dp,而对于480x800的设备,只需屏幕尺寸在3寸到4.3寸之间,密度都会被设置为240dpi,一行同样可以放置320dp。因此在开发中,用dp作为单位,只需要设置一次,就可以适配到多个屏幕上。

    现在我们清楚了这两个名词之间的关系,那么,我们在程序中,如何对两者进行转换呢?

    下面的代码,可以帮助我们实现dp到px的转换

  1.  * 根据手机的分辨率从 dp 的单位 转成为 px(像素) 
  2.      */  
  3.     public static int dip2px(Context context, float dpValue) {  
  4.         //获取当前屏幕密度dpi与基础密度160dpi的倍数关系,+0.5f是为了保证转化成int类型时的数据正确  
  5.         float scale = context.getResources().getDisplayMetrics().density;  
  6.         return (int) (dpValue * scale + 0.5f);  
  7.     }



  1. * 根据手机的分辨率从 px(像素) 的单位 转成为 dp 
  2.      */  
  3.     public static int px2dip(Context context, float pxValue) {  
  4.         //获取当前屏幕密度dpi与基础密度160dpi的倍数关系,+0.5f是为了保证转化成int类型时的数据正确  
  5.         float scale = context.getResources().getDisplayMetrics().density;  
  6.         return (int) (pxValue / scale + 0.5f);  
  7.     }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值