在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. 前端Html+Css——豆蔻年华(自学一个月)

    详细见千万别碰我--燕十三 html .htm .shtml三者区别是什么 1..htm与.html没有本质上的区别,表示的是同一种文件,只是适用于不同的环境之下. 2.DOS仅能识别8+3的文件名, ...

  2. angular笔记

    /** * Created by Administrator on 2016/5/3 0003. */ ng-app是告诉angularjs编译器把该元素当作编译的根 //定义模块 var myApp ...

  3. linux上的编译安装

    计算机运行的程序都是二进制的代码,那么我们所用的编程语言都是自然语言中的字符,那么就需要有一种机制来将这些转化成二进制代码,那么根据转化机制不一样,编程语言(软件 产生的源头)分两大类 解释型 编译型 ...

  4. anyexec

    http://www.codesec.net/view/420386.html http://www.cnblogs.com/qiyebao/p/5362101.html http://www.mon ...

  5. B. Santa Claus and Keyboard Check 模拟

    http://codeforces.com/contest/752/problem/B uuu yyu xy xx 注意变化了之后,检查一次前面已经变化过的就好.因为可能前面的满足,但是变了后不满足. ...

  6. Selenium2+python自动化31-生成测试报告

    前言 最近小伙伴们总有一些测试报告的问题,网上的一些资料生成报告的方法,我试了都不行,完全生成不了,不知道他们是怎么生成的,同样的代码,有待研究. 今天小编写一下可以生成测试报告的方法.个人觉得也是最 ...

  7. easyui中tree使用simpleData的形式加载数据

    了解了zTree的使用, 发现它的simpleData是非常好用的, 由后台返回一个扁平数据, 直接在前台解析成树形菜单, 网上查了一下, easyui也可以简单实现, 不过....没看懂, 先记录一 ...

  8. Android编译环境搭建(0818-0819)

    1 在虚拟机VMware上安装64位Ubuntu14.04LTS 首先需要安装虚拟机并激活.然后新建虚拟机,选择使用下载好的Ubuntu镜像.注意需要将光驱改为自己下载的,而不是autoinst.is ...

  9. 数字电路-异同步 复位 线与 oc门

    1.同步电路和异步电路的区别是什么? 异步电路:主要是组合逻辑电路,用于产生地址译码器.FIFO或RAM的读写控制信号脉冲,但它同时也用在时序电路中,此时它没有统一的时钟,状态变化的时刻是不稳定的,通 ...

  10. 简单介绍智能DNS解析+双线路接入

    导读:在讨论这个问题,其中群友老孤同志也提供了不少非常有参考价值的资料,所以我们再把这些资料再整理一次,从比较底层的技术原理上重新进行一次分析.   我们知道,因为南电信北网通现象的存在,我们的服务器 ...