`

Android 布局中位置和大小单位相关探索

阅读更多
转自: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大小绝对不同的)
分享到:
评论

相关推荐

    android布局_Android布局_android_

    本文将深入探讨Android布局的各种类型及其使用方法,旨在帮助开发者更好地理解和掌握Android应用的UI设计。 首先,我们来了解Android中的基本布局类型: 1. **线性布局(LinearLayout)**:这是最基础的布局,它...

    认识Android布局文件

    理解Android布局文件的使用是开发过程中必不可少的技能。通过LinearLayout,我们可以创建简单的线性布局,控制控件的排列方式和大小。随着学习的深入,还可以探索更复杂的布局容器,如RelativeLayout、...

    android布局属性总结文档

    在Android开发中,布局属性是构建用户界面的关键组成部分。这些属性允许开发者精确地控制各个UI组件的外观和位置。以下是对几种主要布局及其关键属性的详细说明: **LinearLayout**: 这是最基础的布局,可以将子...

    android框架布局demo

    在Android开发中,布局...通过下载并研究"android框架布局demo",你将有机会亲手实践这些概念,进一步加深对Android布局管理的理解,并提高你的应用开发技能。记得不断探索和尝试,让自己的应用界面更加精美和高效。

    Android之布局实例

    在Android应用开发中,布局(Layout)是构建用户界面的核心元素。它定义了屏幕上控件的排列方式和相互关系。本篇文章将详细讲解Android中的五种主要布局:...在实践中不断探索,你会发现Android布局设计的乐趣与魅力。

    android UI布局工具

    "android布局"是指在Android应用中用于控制用户界面元素排列和展示的方式。常见的布局管理器有线性布局(LinearLayout)、相对布局(RelativeLayout)、帧布局(FrameLayout)、网格布局(GridLayout)以及约束布局...

    浅谈Android五大布局

    同时,可以添加子视图,如按钮、文本视图等,并配置它们在布局中的位置和大小。通过组合这些基本布局,开发者可以创建出满足需求的复杂用户界面。 总之,理解并熟练掌握Android的五大布局是每个Android开发者的基本...

    android 界面布局开发实例

    在Android应用开发中,界面布局是至关重要的,它决定了用户与应用交互的方式和体验。本实例专注于Android界面布局的开发,对于初学者来说是一个非常实用的起点。通过这个实例,你可以学习到如何创建、设计和管理...

    Android页面布局

    在Android移动应用开发中,页面布局是构建用户界面的基础,它是屏幕内容的组织方式,决定了元素的排列方式和相互关系。本篇文章将深入探讨四种主要的布局方式:线性布局、表格布局、相对布局和帧布局,以及如何进行...

    android 布局管理

    在Android开发中,布局管理是构建用户界面的关键部分。它涉及到如何组织和排列应用程序中的视图组件,以创建用户友好的交互式界面。本篇将深入探讨Android...在实践中不断探索和优化,才能打造出优秀的Android应用。

    android属性布局大全

    本文将深入探讨“Android属性布局大全”,帮助新手快速理解和掌握Android布局的基本知识。 1. **线性布局(LinearLayout)** 线性布局是最基本的布局,它按照垂直或水平方向排列子视图。通过`orientation`属性设置...

    android-关于布局

    在Android开发中,布局(Layout)是构建...总之,Android布局设计是一个关键的技能,需要不断练习和探索。理解每种布局的特点,灵活运用它们,以及熟练使用布局编辑工具,都将有助于你成为一名出色的Android开发者。

    android的线性布局

    在Android开发中,线性布局(LinearLayout)是基础且至关重要的布局管理器,它用于组织UI元素(如按钮、文本视图等)沿单一方向排列,可以是垂直或水平。本篇文章将深入探讨线性布局的使用方法、属性以及如何在实际...

    Android多能布局

    "Android多能布局"是一个全面的示例项目,它展示了多种Android布局样式的应用,这对于开发者来说是一个宝贵的资源库,帮助他们在实际开发中选择和实现最适合的布局方式。 1. **线性布局(LinearLayout)**:这是最...

    UI.rar_android_android studio_android ui_android ui 布局_页面

    本压缩包“UI.rar”似乎包含了与Android UI设计相关的资源和示例,特别是涉及到不同的页面布局和交互元素。 首先,我们来深入理解Android UI的基础——布局(Layout)。布局在Android中是用来组织和控制屏幕上的...

    android布局学习

    对于初学者来说,理解和熟练运用Android布局是至关重要的。本篇文章将深入探讨Android的经典布局,帮助你更好地掌握这一关键技能。 首先,我们来看看Android中的主要布局类型: 1. **线性布局(LinearLayout)**:...

    Android TextView的图片和文字居中探索

    接着,我们在`onDraw()`方法中分别绘制文字和图片,应用偏移量使得它们都处于居中位置。 当然,这只是一个基础的实现,实际项目中可能需要处理更多复杂情况,例如文字有多行、图片大小不固定等。在这种情况下,可能...

    Android-accordion-swipe-layoutAndroid手风琴滑动布局

    在Android应用开发中,"手风琴滑动布局"(Accordion Swipe Layout)是一种常见的用户界面设计,它允许用户展开和折叠视图,以显示或隐藏更详细的信息。这种布局模式通常用于列表或卡片视图中,以提高用户体验,特别...

    Android开发之玩转FlexboxLayout布局(可实现流式布局)

    传统的Android布局如LinearLayout、RelativeLayout和GridLayout虽然强大,但在处理复杂或动态的布局时可能会显得力不从心。这就是FlexboxLayout的用武之地,它引入了Flexbox布局模型,源自于Web开发中的CSS Flexible...

    Android 实现流式布局的几种方式和FlexboxLayout的使用_qq_36699930的博客-程序员资料

    首先,我们来了解传统的Android布局方式,如LinearLayout、RelativeLayout和ConstraintLayout。这些布局在特定场景下表现出色,但当需要灵活调整子视图顺序和自动换行时,它们就显得力不从心了。 1. **自定义...

Global site tag (gtag.js) - Google Analytics