【转】Androidhdpildpimdpixhdpixxhdpi适配详解
1、了解⼏个概念
(1)分辨率。分辨率就是⼿机屏幕的像素点数,⼀般描述成屏幕的“宽×⾼”,安卓⼿机屏幕常见的分辨率有480×800、720×1280、
1080×1920等。720×1280表⽰此屏幕在宽度⽅向有720个像素,在⾼度⽅向有1280个像素。
(2)屏幕⼤⼩。屏幕⼤⼩是⼿机对⾓线的物理尺⼨,以英⼨(inch)为单位。⽐如某某⼿机为“5⼨⼤屏⼿机”,就是指对⾓线的尺⼨,5⼨×2.54厘⽶/⼨=12.7厘⽶。
(3)密度(dpi,dots per inch;或PPI,pixels per inch)。从英⽂顾名思义,就是每英⼨的像素点数,数值越⾼当然显⽰越细腻。假如我们知道⼀部⼿机的分辨率是1080×1920,屏幕⼤⼩是5英⼨,你能否算出此屏幕的密度呢?哈哈,中学的勾股定理派上⽤场啦!通过宽1080和⾼1920,根据勾股定理,我们得出对⾓线的像素数⼤约是2203,那么⽤ 2203除以5就是此屏幕的密度了,计算结果是440。440dpi的屏幕已经相当细腻了。
2、实际密度与系统密度
尚未发现他处使⽤“实际密度”和“系统密度”这两个词汇,暂时由我如此定义吧。
“实际密度”就是我们⾃⼰算出来的密度,这个密度代表了屏幕真实的细腻程度,如上述例⼦中的440dpi就是实际密度,说明这块屏幕每⼨有440个像素。5英⼨1080×1920的屏幕密度是440,⽽相同分辨率的4.5英⼨屏幕密度是490。如此看来,屏幕密度将会出现很多数值,呈现严重的碎⽚化。⽽密度⼜是安卓屏幕将界⾯进⾏缩放显⽰的依据,那么安卓是如何适配这么多屏幕的呢?
其实,每部安卓⼿机屏幕都有⼀个初始的固定密度,这些数值是120、160、240、320、480,我们权且称为“系统密度”。⼤家发现规律
没有?相隔数值之间是2倍的关系。⼀般情况下,240×320的屏幕是低密度120dpi,即ldpi;320×480的屏幕是中密度160dpi,即 mdpi;480×800的屏幕是⾼密度240dpi,即hdpi;720×1280的屏幕是超⾼密度320dpi,即xhdpi;1080×1920的屏幕是超超⾼密度480dpi,即xxhdpi。
安卓对界⾯元素进⾏缩放的⽐例依据正是系统密度,⽽不是实际密度。
3、⼀个重要的单位dp
dp也可写为dip,即density-independent pixel。你可以想象dp更类似⼀个物理尺⼨,⽐如⼀张宽和⾼均为100dp的图⽚在320×480和
480×800的⼿机上“看起来”⼀样⼤。⽽实际上,它们的像素值并不⼀样。dp正是这样⼀个尺⼨,不管这
个屏幕的密度是多少,屏幕上相同dp ⼤⼩的元素看起来始终差不多⼤。
另外,⽂字尺⼨使⽤sp,即scale-independentpixel的缩写,这样,当你在系统设置⾥调节字号⼤⼩时,应⽤中的⽂字也会随之变⼤变⼩。
4、dp与px的转换
在安卓中,系统密度为160dpi的中密度⼿机屏幕为基准屏幕,即320×480的⼿机屏幕。在这个屏幕中,1dp=1px。
100dp在320×480(mdpi,160dpi)中是100px。那么100dp在480×800(hdpi,240dpi)的⼿机上是多少 px呢?我们知道100dp在两个⼿机上看起来差不多⼤,根据160与240的⽐例关系,我们可以知道,在480×800中,100dp实际覆盖了 150px。因此,如果你为mdpi⼿机提供了⼀张100px的图⽚,这张图⽚在hdpi⼿机上就会拉伸⾄150px,但是他们都是100dp。
中密度和⾼密度的缩放⽐例似乎可以不通过160dpi和240dpi计算,⽽通过320px和480px也可以算出。但是按照宽度计算缩放⽐例不适⽤于超⾼密度xhdpi和超超⾼密度xxhdpi了。即720×1280中1dp是多少px呢?如果⽤720/320,你会得出1dp=2.25px,实际这样算出来是不对的。dp与px的换算要以系统密度为准,720×1280的系统密度为320,320×480的系统密度为 160,320/160=2,那么在720×1280
中,1dp=2px。同理,在1080×1920中,1dp=3px。
⼤家可以记住下⾯这个⽐例,dp与px的换算就⼗分easy啦!
ldpi:mdpi:hdpi:xhdpi:xxhdpi=3:4:6:8:12,我们发现,相隔数字之间还是2倍的关系。计算的时候,以mdpi 为基准。⽐如在
720×1280(xhdpi)中,1dp等于多少px呢?mdpi是4,xhdpi是8,2倍的关系,即1dp=2px。反着计算更重要,⽐如你⽤PhotoShop在720×1280的画布中制作了界⾯效果图,两个元素的间距是20px,那要标注多少dp呢?2倍的关系,那就是 10dp!
当安卓系统字号设为“普通”时,sp与px的尺⼨换算和dp与px是⼀样的。⽐如某个⽂字⼤⼩在720×1280的PS画布中是24px,那么告诉⼯程师,这个⽂字⼤⼩是12sp。
5、建议在xdhpi中作图
安卓⼿机有这么多屏幕,我到底依据哪种屏幕作图呢?没有必要为不同密度的⼿机都提供⼀套素材,⼤部分情况下,⼀套就够了。
一般使用的分辨率的显示密度是多少dpi现在⼿机⽐较⾼的分辨率是1080×1920,你可以选择这个尺⼨作图,但是图⽚素材将会增⼤应⽤安装包
的⼤⼩。并且尺⼨越⼤的图⽚占⽤的内存也就越⾼。如果你不是设计ROM,⽽是做⼀款应⽤,我建议⼤家⽤PS在720×1280的画布中作图。这个尺⼨兼顾了美观性、经济性和计算的简单。美观性是指,以这个尺⼨做出来的应⽤,在720×1280中显⽰完美,在1080×1920中看起来也⽐较清晰;经济性是指,这个分辨率下导出的图⽚尺⼨适中,内存消耗不会过⾼,并且图⽚⽂件⼤⼩适中,安装包也不会过⼤;计算的简单,就是1dp=2px啊,多好计算啊!
做出来的图⽚,记着让界⾯⼯程师放进drawable-xhdpi的资源⽂件夹中。
6、屏幕的宽⾼差异
在720×1280中作图,要考虑向下兼容不同的屏幕。通过计算我们可以知道,320×480和480×800的屏幕宽度都是320dp,⽽ 720×1280和1080×1920的屏幕宽度都是360dp。它们之间有40dp的差距,这40dp在设计中影响还是很⼤的。如下图蝴蝶图⽚距离屏幕的左右边距在320dp宽的屏幕和360dp宽的屏幕中就不⼀样。
不仅宽度上有差异,⾼度上的差异更加明显。对于天⽓等⼯具类应⽤,由于界⾯⼀般是独占式的,更要考虑屏幕之间的⽐例差异
如果想消除这些⽐例差异,可以通过添加布局⽂件来实现。⼀般情况下,布局⽂件放在layout⽂件夹中,
如果要单独对360dp的屏幕进⾏调整,你可以单做做⼀个布局⽂件放在layout-w360dp中;如果你想对某个特殊的分辨率进⾏调整,那么你可以将布局⽂件放在标有分辨率的⽂件夹中,如 layout-854×480。
7、⼏个资源的⽂件夹
在720×1280中做了图⽚,要让开发⼈员放到drawable-xhdpi的资源⽂件夹中,这样才可以显⽰正确。个⼈认为仅提供⼀套素材就可以了,可以测试⼀下应⽤在低端⼿机上运⾏是否流畅,如果⽐较卡顿,可以根据需要提供部分mdpi的图⽚素材,因为xhdpi中的图⽚运⾏在mdpi的⼿机上会⽐较占内存。
以应⽤图标为例,xhdpi中的图标⼤⼩是96px,如果要单独给mdpi提供图标,那么这个图标⼤⼩是48px,放到drawable-mdpi 的资源⽂件夹中。各个资源⽂件夹中的图⽚尺⼨同样符合ldpi:mdpi:hdpi:xhdpi:xxhdpi=3:4:6:8:12的规律。
如果你把⼀个⾼2px的分割线素材做成了9.png图⽚,你想让细线在不同密度中都是2px,⽽不被安卓根据密度进⾏缩放,怎么办?你可以把这个分割线素材放到drawable-nodpi中,这个资源⽂件夹中的图⽚,将按照实际像素⼤⼩进⾏显⽰,⽽不会被安卓根据密度进⾏缩放。即在mdpi中细线是2px(2dp),在xhdpi中细线是2px(1dp)。
以上是对安卓屏幕的初步总结,不知道你看完后是豁然开朗,还是⼀头雾⽔?这篇⽂章主要为了实⽤起见,避开了过多深⼊的分析,如果你还有什么疑问,可以留⾔。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论