转自:http://blog.sina.com.cn/s/blog_602f87700102v2q8.html

在Android Layout xml文件编辑中,常常需要指定View的位置,大小,间距等。 这些数值可以用多种单位来设置。例如: "120dp" , "60dip", "30px" , "10mm" , "1in" , "36pt"等。

各自涵义如下:
dp: (Density-independent pixel). 密度无关像素单位。
dip: dp的另一种写法。
px: pixel. 像素点。
mm: millimeters .毫米。
in: inches,英寸。
pt:points,点(英寸的 1/72)

(mm(毫米), in(英寸), pt(点) 并非简单的指在屏幕上的大小就是1毫米,1英寸,1点,稍后具体讲解)

先从px(pixel)和dp(Density-independent pixel)说起。

0. 基础知识:
0.1: 屏幕密度(Screen density):
在屏幕的物理单元区域内像素(pixel)的数量。通常单位为dpi(dots per inch). 低密度的屏幕比高密度的屏幕在单位面积上的像素点(pixel)要少。Android将屏幕密度分6级: low, medium, high, extra-high, extra-extra-high, and extra-extra-extra-high
dpi(dots per inch): 每英寸长度内点的个数。160dpi: 则说明在每英寸的距离上,可以显示160个pixel.

0.2:分辨率(Resolution):
屏幕的物理像素点的最大数量。



0.3: dp(Density-independent pixel)相关信息:
Android设备会运行在各种类型的设备上,显示屏也类型多样。不同的显示屏屏幕密度也不同。如果在UI制作时,指定某个距离是N 个Pixel。则在屏幕密度不同的设备上,这个距离就会明显不同。例如:Screen A 160dpi 。Screen B 320dpi 则在Screen A上这个距离仅是Screen B上这个距离的一半。所以需要一个计量单位,与屏幕密度没有关系。所以就产生了dp(Density-independent pixel).

dp: 一个虚拟的像素(pixel)单位,使用它定义UI Layout,则定义的尺寸和位置和屏幕密度无关。
density-independent像素与160dpi屏幕下的像素(pixel)相同。
在真实使用的屏幕像素密度不为160dpi时,系统会根据屏幕密度自动转换dp值到真实pixel值。转换公式为:
px = dp * (dpi / 160)
例如:dpi等于240的屏幕。 一个dp等于1.5个pixel. dpi等于320的屏幕, 一个dp等于2个pixel.


在Android Layout UI 的长度单位使用上,推荐使用dp,使得UI在屏幕密度不同的屏幕上效果相同。


1. 编程得到分辨率和屏幕密度:
DisplayMetrics mertric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(mertric);

Log.w("SamInfo:", String.format("Screen Size is:[%dx%d]. Screen density:[%f]. DPI:[%d]. XDPI:[%f]. YDPI:[%f]. scaledDensity:[%f]", mertric.widthPixels, mertric.heightPixels, mertric.density, mertric.densityDpi, mertric.xdpi, mertric.ydpi, mertric.scaledDensity));

mertric.widthPixels,
mertric.heightPixels,
mertric.density,
mertric.densityDpi,
mertric.xdpi,
mertric.ydpi,
mertric.scaledDensity

分别得到多种信息。



2. 显示的实际大小探讨:
前面提到UI中的单位包括mm(毫米), in(英寸), pt(点),这些都是绝对数据。就算px,dp,在知道一些数据如屏幕密度值后,还是可以计算出它的理论真实大小的。那么是否可以说,我们在Layout Xml 文件中定义的距离,与实际显示中的真实大小(比如几英寸或者几毫米)完全匹配呢?

思考以下几个问题:
A . 长度为1in(英寸)的Button. 是否在不同尺寸,不同分辨率,不同屏幕密度的Screen上长度相同?
B. 长度为160dp的Button。 是否在不同尺寸,不同分辨率,不同屏幕密度的Screen上长度相同?


理论上:
A:1in长度的Button, 在人和Screen上,不管其尺寸,分辨率,屏幕密度有何区别,都应该是1英寸长。
B:长度为160dp的Button则稍有复杂。分析如下:
不管屏幕尺寸,分辨率,只要屏幕密度为160dpi. 则此Button长度都应该是1in。
不管屏幕尺寸,分辨率,屏幕谜底为Ndpi. 每个dp所占pixel应该有:(N/160)个。所以160个dp 需要(N/160)*160个pixel. 即N个Pixel。 N个pixel. 不正就是1in的长度么?

所以从理论上来说:1in的Button。160dp的Button。在任意尺寸,任意分辨率,任意屏幕密度下,长度都是真实的1in.(事实真的如此么?很值得怀疑吧,很明显,同样的程序在手机上,和在电视机上,1in的Button大小绝对不同的)

更多相关文章

  1. Android滚动截屏,ScrollView截屏
  2. Android(安卓)禁止响应屏幕翻转
  3. Qt Android(安卓)QScreen 屏幕旋转功能
  4. Android(安卓)用HorizontalScrollView实现ListView的Item滑动删
  5. Android(安卓)动态指定屏幕朝向,动态设置控件位置大小
  6. 安卓阵营猛兽多,摩托Droid 3酷了一夏!
  7. Android(安卓)尺寸dp,sp
  8. android游戏开发适应多屏幕的问题 .
  9. Android(安卓)基于坐标的图形开发

随机推荐

  1. android EditText inputType
  2. .Net 转战 Android 4.4 日常笔记(6)--Andro
  3. Android(安卓)Bluetooth
  4. Android RelativeLayout 的属性
  5. android中使用 EditText 时,设定 inputTyp
  6. 浅谈android的selector,背景选择器
  7. 如何解析 android 中的 XML?
  8. 解决 Android(安卓)Studio:Failed to reso
  9. 别人学习android的用到的书和路线
  10. ImageView 常用属性的分析