在Android手机的诞生之初,由于Android系统是开源的,一开始便有众多的OEM厂商对Android手机进行深度定制,于是乎Android手机的皮肤和屏幕大小都变得百花齐放,这可苦逼了我们这群开发者,因为我们被要求要注意写出一个好的Android软件,写一次代码就能适应大小不同的屏幕。这就好比,你做了一套衣服,要让不同身材的人都穿得合身,类似于生活中的道理,我们这套衣服肯定不能用没有弹性的布料,所以我们要像生活中那种无尺码,有弹性的衣服学习,在代码里面尽量让界面能够自动适应屏幕的大小,幸好Android操作系统提供了一些这方面的屏幕适应机制。

屏幕上的图案最终就是由一个个的点构成的,也就是说我们最终要控制的就是怎么合理地拉伸屏幕上的点,以便让界面合理地铺到界面上,好像专门为了用户手中的这块屏幕开发的一样,android中的界面显示单位主要有px,dp(dip),sp等,下面我们将简单地介绍它们并提出在什么场合使用。

几乎是一条定律:

除了sp和dp,不要使用别的单位,除非你没有办法不那么做。使用sp/dp会让你的Android应用适应多种密度和分辨率。--Daniel Lew

关于Android中如何适应不同的屏幕大小及分辨率,看了一些文章,其中比较经典的一个stackoverflow上的讨论《Android手机上px,dp,dip和sp的区别》,下面让我们看看dp和px的区别

先直观地看看dp和px的显示效果。

图1.设置相同的px,界面元素在不同的屏幕密度下的表现

从图1中,我们可以看出,当屏幕的尺寸(用英寸来表示)相同时,在不同屏幕密度(density)下,用等大的像素来表示的时候,在低屏幕密度的屏幕上显示得比较大(如上图中的左侧图片),在高屏幕密度的屏幕上显示得比较小(如上图中的右侧图片)。

图2.设置相同的dip,界面元素在不同的屏幕密度下的表现

从图2中,可以看出,在屏幕的尺寸相同时,而屏幕的密度不同是,界面元素在铺在界面上的比例相同。这是因为图2中界面元素的显示单位用的是dip,它能够根据屏幕密度自动调整界面元素的大小,让界面元素以恰当的比例显示在屏幕上。

注意:当两块屏幕的长和宽可以用相同的dip来表示的话,那么界面元素能够按照屏幕密度自动拉伸到恰当的大小,但是如果两块屏幕的长宽不能用相同的dip元素来表示的话,那么界面虽然会根据屏幕密度拉伸,但是拉伸的比例也不会正确。因为根据dip、屏幕密度进行拉伸的原理,其实是长或宽的dip数乘以屏幕密度进而得到正确的像素(pixels),因为最终要显示到屏幕上的时候,必须要将界面显示的单位落实到像素(pixels)上,只是Android系统自动帮我们完成了这个转换的工作。

dp(dip)是什么

dp(或dip)的全称是Density-independent Pixels(密度独立像素) 。dp是一个抽象单位,建立在屏幕的物理密度上。这些单位都是相对于一个160 dpi(dots per inch 每英寸拥有的点数)屏幕,上面1 dp几乎等于1 px。当运行在更高密度的屏幕上,原先描绘1dp的像素需要根据一个合适的比例扩大到一定的数量,以便适合屏幕的dpi。同样,当在一个低密度屏幕,用来显示1dp的像素需要按比例缩小一定的数量。dp转化成pixe的比率会随着屏幕的密度改变,但不一定成正比。使用dp单位(而不是px)是一个简单的解决方案,使得在你的布局(LayOut)中界面元素的大小,能根据不同的屏幕密度调整到适当的大小。换句话说,它提供了在不同的设备中,UI元素实际大小的一致性。

px是什么

Pixels(像素)——对应于实际的像素在屏幕上。这个单位是不建议使用的,因为界面可能需要显示在多个设备中,每个设备可能有不同屏幕密度和屏幕上所有像素的数量可能更多或者更少。

什么时候用dip

当屏幕的长宽用dip表示时,长宽都是相同的话,那么就可以使用dip进行界面元素的大小的布局,Android会自动帮我们拉伸到合适的尺寸,但是,如果屏幕差异太大的话,那么用dip进行布局大小的限定还是会出现问题的。

示例代码

参考链接

Supporting Multiple Screens

Android实用代码七段(一)

Android屏幕密度(Density)和分辨率的关系

Android Density(密度)

Dimension

Difference between px, dp, dip and sp in Android?

Android中px和dip的区别的更多相关文章

  1. Android中px dpi dip density densityDpi 的相关说明

    转自:http://www.cnblogs.com/wader2011/archive/2011/11/29/2267490.html 概念解释 名词 解释 Px (Pixel像素) 不同设备显示效果 ...

  2. (转)Android中px与dip,sp与dip等的转换工具类

    功能 通常在代码中设置组件或文字大小只能用px,通过这个工具类我们可以把dip(dp)或sp为单位的值转换为以px为单位的值而保证大小不变.方法中的参数请参考http://www.cnblogs.co ...

  3. Android的px、dip、sp的区别

    Android的px.dip.sp的区别 我们在页面布局的时候,经常会设置容器的长度,但是到底该使用哪个作为长度的单位而懊恼. 在Android中支持的描述大小区域的类型有以下几种:   px(pix ...

  4. Android中px, ppi, dpi, dp, dip, sp概念解析

    Android中px, ppi, dpi, dp, dip, sp概念解析

  5. Android中style和theme的区别

    在学习Xamarin android的过程中,最先开始学习的还是熟练掌握android的六大布局-LinearLayout .RelativeLayout.TableLayout.FrameLayou ...

  6. 【整理】Android中的gravity和layout_gravity区别

    [背景] 在Android中,想要设置个按钮的水平对齐,都累死了: [已解决]ADT中已设置TableLayout布局的情况下如何设置按钮居中对齐    所以现在有必要搞清楚,到底gravity和la ...

  7. Html代码Font-Size中px与pt的区别

    一个是设备坐标,一个是逻辑坐标,两者是不同的. px是个相对单位,一般像素的参考值为:在一个像素密度是90 pdi的显示器上,正常人从距离显示器28英寸处看一个像素的视角应该不小于0.0227度. 1 ...

  8. 浅谈Android中Serializable和Parcelable使用区别

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.概述 Android开发的时候,我们时长遇到传递对象的需求,但是我们无法将对象的引用传给Activity或者Fragment,我们需要将这些对象 ...

  9. Android中Popupwindow和Dialog的区别

    Android中的对话框有两种:PopupWindow和AlertDialog.它们都可以实现弹窗功能,但是他们之间有一些差别,下面总结了一点. (1)Popupwindow在显示之前一定要设置宽高, ...

随机推荐

  1. Linux设置静态IP

    在做项目时由于公司局域网采用自动获取IP的方式,导到每次服务器重启主机IP都会变化.为了解决这个问题,我参考了http://blog.sina.com.cn/s/blog_537977e50100qh ...

  2. 4.0以后的新布局方式GridLayout

    <?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android=" ...

  3. oracle 做算法 数据为空时,默认为0

    SELECT NVL('',0) FROM DUAL 获取当前日期: SELECT SYSDATE FROM DUAL 当前日期-某个日期差的天数 SELECT  TO_NUMBER(SYSDATE  ...

  4. 关于web测试

    关于web测试1页面部分(1) 页面清单是否完整(是否已经将所需要的页面全部都列出来了)(2) 页面是否显示(在不同分辨率下页面是否存在,在不同浏览器版本中页面是是否显示)(3) 页面在窗口中的显示是 ...

  5. 【项目】搜索广告CTR预估(一)

    本文介绍CTR相关基础知识. 一.广告投放系统 广告系统包含多个子系统.除了上图所示的广告投放系统外,还包含商业系统(广告库的获得),统计系统(点击展示日志的获得)等. 广告投放系统主要是面向用户的, ...

  6. Android 中的 WebView实现 Html5 标签网页加载

    自Android 4.4起,Android中的WebView开始基于Chromium(谷歌浏览器)支持浏览器的一系列功能,webkit解析网页各个节点,这个改变,使得WebView的性能大幅度提升,并 ...

  7. 连接Oracle的帮助类

    package util; import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedState ...

  8. 5.HotSpot的算法实现

    1.枚举根节点 在可达性分析中,可以作为GC Roots的节点有很多,但是现在很多应用仅仅方法区就有上百MB,如果逐个检查的话,效率就会变得不可接受. 而且,可达性分析必须在一个一致性的快照中进行-即 ...

  9. Boo who

    function boo(bool) { // What is the new fad diet for ghost developers? The Boolean. //return bool; r ...

  10. 洛谷P1738 洛谷的文件夹

    原题目:点我 题目是一个略水的题,我机制地用面向对象做了...所以代码量急剧加大,100行233 模拟即可,字符串处理麻烦点.如果没有找到子文件夹就新建文件夹,如果有就进入该文件夹. 提示:高能,指针 ...