Android之UI进阶(1)像素单位

本文介绍了Android屏幕分辨率与DP单位的关系,解析了DP在不同density下的换算,强调了在处理UI设计时考虑特殊设备的重要性,并探讨了PT、SP、DP之间的转换。同时,提到了Android资源包对不同密度的支持以及在代码中动态处理尺寸的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

屏幕分辨率
首先要了解Android屏幕分辨率,从density来看,常见的分辨率对应关系有:
hdpi = 480x800 (如Nexus One/Nexus S)
mdpi = 320x480 (如HTC Wildfire S G13)
ldpi = 240x320 (如HTC G8)
除此之外,还有xhdpi = 960x640 (如魅族M9)
但以上只是常见的而已,实际分辨率像素数量与density无关,例如SonyEricsson X10分辨率是480x854也是hdpi,Kindlefire 的分辨率是 1024x600但实际是mdpi(large-mdpi)。另外还有各种山寨诡异的屏幕分辨率,暂且不说。

更多的参数关系可以参考:
http://developer.android.com/guide/practices/screens_support.html

什么是DP
有了以上知识之后,再看看dp。dp的意义是按照mdpi下px:dp = 1:1换算,其他分辨率按照density比例算出来(xhdpi=320,hdpi=240,mdpi=160,ldpi=120),如果不想记density值,则按照标注屏幕宽度比例换算也可以(对large-*dpi无效),也就是说:
mdpi下屏幕宽度为320px,所以就是320dp,半个屏幕自然就是160dp
hdpi下dp:px = 1:1.5 (按照屏幕宽480/320=1.5算出来),所以160dp也等于半个屏幕宽
ldpi下dp:px = 3:4 = 1:0.75 (按照240/320=0.75算出来),所以160dp也等于半个屏幕
……
其他算法也一致,所以对于常见的标准分辨率来说半个屏幕宽度就是160dp。

其他可能的问题
但仍需要考虑很多特殊情况,例如:对于像Kindlefire这种large-mdpi来说,160dp=160px,而人家实际宽度为600,就肯定是不对的。如果横屏,横屏对于480x800的hdpi的一半是400px/1.5 = 267dp,而对于480x854的hdpi的一般则是427px/1.5 = 285dp,所以会出现很多问题。

动态代码处理
所以,最为保险的方式,是在代码中,调用:

<ol style="list-style-position: outside; border-style: none; padding: 0px 0px 0px 10px; margin: 0px;" class="linenums"><li style="border-style: none; padding: 0px 0px 0px 10px; line-height: 30px; list-style-type: decimal; margin: 0px; color: rgb(153, 153, 153); background-color: rgb(250, 250, 250);" class="L0"><span style="color: rgb(43, 145, 175); font-weight: bold;" class="typ">DisplayMetrics</span><span style="color: rgb(0, 0, 0);" class="pln"> metrics </span><span style="color: rgb(0, 0, 0);" class="pun">=</span><span style="color: rgb(0, 0, 0);" class="pln"> </span><span style="color: rgb(0, 0, 139); font-weight: bold;" class="kwd">new</span><span style="color: rgb(0, 0, 0);" class="pln"> </span><span style="color: rgb(43, 145, 175); font-weight: bold;" class="typ">DisplayMetrics</span><span style="color: rgb(0, 0, 0);" class="pun">();</span><span style="color: rgb(0, 0, 0);" class="pln"></span>
</li><li style="border-style: none; padding: 0px 0px 0px 10px; line-height: 30px; list-style-type: decimal; margin: 0px; color: rgb(153, 153, 153); background-color: rgb(250, 250, 250);" class="L1"><span style="color: rgb(0, 0, 0);" class="pln">getWindowManager</span><span style="color: rgb(0, 0, 0);" class="pun">().</span><span style="color: rgb(0, 0, 0);" class="pln">getDefaultDisplay</span><span style="color: rgb(0, 0, 0);" class="pun">().</span><span style="color: rgb(0, 0, 0);" class="pln">getMetrics</span><span style="color: rgb(0, 0, 0);" class="pun">(</span><span style="color: rgb(0, 0, 0);" class="pln">metrics</span><span style="color: rgb(0, 0, 0);" class="pun">);</span><span style="color: rgb(0, 0, 0);" class="pln"></span>
</li><li style="border-style: none; padding: 0px 0px 0px 10px; line-height: 30px; list-style-type: decimal; margin: 0px; color: rgb(153, 153, 153); background-color: rgb(250, 250, 250);" class="L2"><span style="color: rgb(0, 0, 0);" class="pln"></span><span style="color: rgb(0, 0, 139); font-weight: bold;" class="kwd">int</span><span style="color: rgb(0, 0, 0);" class="pln"> screenHalfWidth </span><span style="color: rgb(0, 0, 0);" class="pun">=</span><span style="color: rgb(0, 0, 0);" class="pln"> metrics</span><span style="color: rgb(0, 0, 0);" class="pun">.</span><span style="color: rgb(0, 0, 0);" class="pln">widthPixels </span><span style="color: rgb(0, 0, 0);" class="pun">/</span><span style="color: rgb(0, 0, 0);" class="pln"> </span><span style="color: maroon;" class="lit">2</span><span style="color: rgb(0, 0, 0);" class="pun">;</span></li></ol>

然后修改view的大小:

<ol style="list-style-position: outside; border-style: none; padding: 0px 0px 0px 10px; margin: 0px;" class="linenums"><li style="border-style: none; padding: 0px 0px 0px 10px; line-height: 30px; list-style-type: decimal; margin: 0px; color: rgb(153, 153, 153); background-color: rgb(250, 250, 250);" class="L0"><span style="color: rgb(0, 0, 0);" class="pln">view</span><span style="color: rgb(0, 0, 0);" class="pun">.</span><span style="color: rgb(0, 0, 0);" class="pln">setLayoutParams</span><span style="color: rgb(0, 0, 0);" class="pun">(</span><span style="color: rgb(0, 0, 139); font-weight: bold;" class="kwd">new</span><span style="color: rgb(0, 0, 0);" class="pln"> </span><span style="color: rgb(43, 145, 175); font-weight: bold;" class="typ">LayoutParams</span><span style="color: rgb(0, 0, 0);" class="pun">(</span><span style="color: rgb(0, 0, 0);" class="pln">screenHalfWidth</span><span style="color: rgb(0, 0, 0);" class="pun">,</span><span style="color: rgb(0, 0, 0);" class="pln"> </span><span style="color: rgb(43, 145, 175); font-weight: bold;" class="typ">LayoutParams</span><span style="color: rgb(0, 0, 0);" class="pun">.</span><span style="color: rgb(0, 0, 0);" class="pln">WRAP_CONTENT</span><span style="color: rgb(0, 0, 0);" class="pun">));</span></li></ol>

px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320×480像素,这个用的比较多。

pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;

sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。由此,根据 google 的建议,TextView 的字号最好使用 sp 做单位,而且查看TextView的源码可知 Android 默认使用 sp 作为字号单位。

sp和dp一样,是android开发里特有的单位,设计师在做UI设计的时候通常最初是建立320*480这个尺寸的画布开始的,这个尺寸的画布在android分辨率的分类中称为mdpi,在这个尺寸下,ps里的1px就等于android中的1dp,同样,这个时候1点的字就等于android中1sp,举个栗子:你建立画布的尺寸是320-480,里面的文字是30点,那么它就是30sp。

下面我们来详细讲解下pt 、sp、dp之间的换算关系

Android支持下列所有单位:
px(像素):屏幕上的点。
in(英寸):长度单位。
mm(毫米):长度单位。
pt(磅):1/72英寸。
dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。
dip:与dp相同,多用于android/ophone示例中。
sp(与刻度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。

分辨率:整个屏是多少点,比如800×480,它是对于软件来说的显示单位,以px为单位的点。 density(密度)值表示每英寸有多少个显示点,与分辨率是两个概念。

Density的意思是“密度”。密度,就是说单位面积内的容量大小。
HVGA屏density=160
QVGA屏density=120
WVGA屏density=240
WQVGA屏density=120
density值表示每英寸有多少个显示点,与分辨率是两个概念。

apk的资源包中,

当屏幕density=240时使用hdpi标签的资源
当屏幕density=160时,使用mdpi标签的资源
当屏幕density=120时,使用ldpi标签的资源。
一般android设置长度和宽度多用dip,设置字体大小多用sp. 在屏幕密度为160,1dp=1px=1dip, 1pt = 160/72 sp 1pt = 1/72 英寸.当屏幕密度为240时,1dp=1dip=1.5px.

 

举例说明:

对于一部wvga(480×800)手机(G7、N1、NS),一般是运行在hdpi模式下。当运行在hdpi模式下时,1dp=1.5px:也就是说设计师在PS里定义一个item高72px,开发就会定义该item高48dp;Photoshop中21px大的字体,开发会定义为14sp。

 

另外mdpi、hdpi、xhdpi是android屏幕分辨率的单位。别搞混了!

 

扩展阅读:Android界面设计专业术语:xxxhdpi和4K分辨率

android的分辨率和IOS类似,它有四个像素密度,android提供120DPI(低密度),160DPI(中密度),240DPI(高密度)和320DPI(超高密度),所有用户界面都是基于四个密度之一的尺寸来设计的。要支持所有4个密度,是很悲剧的。如果一开始是以160DPI来设计,那么你就需要扩展这些密度到100%、150%和200%。

AndroidDPI设计知识详解:

ppi(pixels per inch):图像的采样率(在图像中,每英寸所包含的像素数目)
dpi(dots per inch):打印分辨率(每英寸所能打印的点数,即打印精度)等。



整理自:http://blog.youkuaiyun.com/findsafety/article/details/9129831

http://www.25xt.com/appdesign/5403.html

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1129/647.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值