Android进阶练习-匹配多种屏幕
这几天学习了Android下应用程序对不同屏幕密度适应的问题,其中涉及到图片资源,布局资源,使用固定尺寸,资源的查找规则等问题
屏幕概念
明确手机屏幕的尺寸、密度、分辨率等几个概念
1, Screen size 屏幕的尺寸,即对角线长度(单位inch-英寸)
2, Screen density屏幕密度,即单位长度像素点数(pots/inches)
3, Resolution 分辨率,即屏幕的总像素点数(width * height)
4, Density-independent pixel (dp)独立像素密度。标准是160dip.即1dp对应1个pixel,计算公式如:px = dp * (dpi / 160),屏幕密度越大,1dp对应的像素点越多,相应的屏幕显示的也更清晰
屏幕的分类
可以根据公式px = dp * (dpi / 160)算出屏幕的高和宽dp表示
应用对应的资源目录为xhdpi,hdpi,mdpi,ldpi
两个手机屏幕分辨率可能相同,但密度有可能差了一个级别,对应的资源目录也就不同了,这点要注意一下
比如提供给我们的模拟器当中5.1"WVAG(480*800:mdpi)和Nexus One(3.7",480*800:hdpi),前者的密度是160,后者的密度为240,但它们的分辨率是一样的
图片资源的匹配
drawable-ldpi
为small密度时,
该图片即适用于横屏,也适用于竖屏
drawable-land-ldpi
当屏幕为横屏,且为small密度时,加载此文件夹中的资源
drawable-port-ldpi
当屏幕为竖屏,且为small密度时,加载此文件夹中的资源
drawable-mdpi
为normal密度时,
该图片即适用于横屏,也适用于竖屏
drawable-land-mdpi
当屏幕为横屏,且为normal密度时,加载此文件夹中的资源
drawable-port-mdpi
当屏幕为竖屏,且为normal密度时,加载此文件夹中的资源
drawable-hdpi 为large密度时,该图片即适用于横屏,也适用于竖屏
drawable-land-hdpi
当屏幕为横屏,且为large密度时,加载此文件夹中的资源
drawable-port-hdpi
当屏幕为竖屏,且为large密度时,加载此文件夹中的资源
drawable-hdpi
为xlarge密度时,
该图片即适用于横屏,也适用于竖屏
drawable-land-hdpi
当屏幕为横屏,且为xlarge密度时,加载此文件夹中的资源
drawable-port-hdpi
当屏幕为竖屏,且为xlarge密度时,加载此文件夹中的资源
需要注意的是当横竖屏切换时,系统会去自动加载对应的资源目录中图片
固定尺寸的适配
有些时候我们避免不了要使用一些固定的尺寸,虽然并不建议这样做,这时我们该怎么做呢
查看google提供的样例应用中发现,原来可以在不同的values目录下,新建dimens.xml文件来进行匹配
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen >
<dimen name="activity_vertical_margin">16dp</dimen >
</resources>
在layout中使用 @dimens/
activity_horizontal_margin 进行引用
values资源目录和drawable资源目录用类似的目录结构来进行屏幕的匹配适应,但由于Android操作系统3.0版本是特定于给PAD使用,PAD上使用values-v11目录来匹配3.0版PAD
values资源目录还可以像这样指定values-sw600dp,意思是说屏幕的最短边要达到600dp才能够进行匹配,但不知道优先级咋样,知道的朋友望告诉一下=.=
其实values目录还有许多其它的作用,可以在不同的分辨率下指定样式,布局layout文件、drawable图片、bool值等
可以下载样例程序:http://www.android-doc.com/training/multiscreen/index.html 来参考
布局资源layout的适配
根据不同的屏幕大小界面可能会不一样,layout资源的匹配和尺寸、图片的匹配大同小异
系统都是根据当前屏幕分辨率特征寻找对应目录下的资源,
layout_hdpi、layout_mdpi、layout、layout_ldpi
资源的查找规则
如果有个别资源目录不存在需要引用的资源,那么Android系统会去'相近'资源目录中寻找,以layout为例
如果一个大屏手机适配的话,适配的顺序是layout_hdpi->layout_mdpi->layout->layout_ldpi;
如果一个中屏手机适配的话,适配的顺序是layout_mdpi->layout->layout_hdpi->layout_ldpi;
如果一个小屏手机适配的话,适配的顺序是layout_ldpi->layout->layout_mdpi->layout_hdpi;
Android寻找最佳资源原理
1, 排除与设备设置不符合的资源
2, 根据限定词(qualifier)的优先级,按照顺序查找
3, 在限定词下,是否存在资源路径
4, 排除不包含在限定词中的资源路径
5, 继续执行不同的限定词查找,直到找到相应的资源
根据这种规则,当我们只为应用准备一套资源时,应该放在layout_mdpi目录中,而不是新建layout目录来存放,其它类型资源同理
最后
别忘了在manifestxml进行如下定义,意思是让应用支持相应的分辨率
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true" />