术语篇
主要影响Android屏幕的,一曰:尺寸(屏幕大小);二曰:密度(屏幕像素密度)。
其中尺寸主要影响的是布局,举例来说,你为小屏幕设计的布局在大屏幕上就显得空余太多,为大屏幕设计的布局在小屏幕就容纳不下,所以Android小屏幕一般为单窗格布局,而为大屏幕设计多窗格布局(具体后面再论述)
密度则是影响图像显示效果的,密度定义为屏幕在一定物理区域内的像素的个数,通常用dpi表示(dpi-每英寸像素个数),由此可知,高密度屏幕在相同的物理区域内像素个数肯定是多于低密度屏幕的,那么对于相同的图片,在高密度屏幕上显示的就要小,低密度屏幕上就显得大。
注意密度和尺寸两个概念相互独立,大尺寸也可以是低密度,高密度也可以是普通尺寸。
更详细的一些术语介绍:
屏幕尺寸
实际的物理尺寸,测量屏幕的对角线。
为简单起见, Android中的所有实际的屏幕尺寸分为四个广义大小:小,正常,大,和超大。
屏幕像素密度
屏幕的物理区域内的像素的数量:通常被称为dpi(每英寸点数) 。例如,在给定的物理区域内一个低密度屏幕比正常或高密度屏幕具有较少的像素。为简单起见, Android中的所有实际的屏幕密度分为六个广义密度:低,中,高,超高,超超高,超超超高。
方向
从用户的角度看到的屏幕方向。一般为横向或纵向,即屏幕的宽高比。注意,不仅要关注不同的设备在缺省情况下的屏幕方向。同一设备当用户旋转时,应用程序的屏幕方向也需要关注。
分辨率
在屏幕上的物理像素的总数。当为多个屏幕添加了支持,应用程序不直接与分辨率相关:应用程序应只能与屏幕大小和密度有关,和指定的广义的大小和密度基有关。
密度无关像素(DP)
虚拟像素单元。在定义UI布局的时候,你应当使用与密度无关的方式来表示布局尺寸或者位置
密度无关的像素相当于在一个160dpi屏幕上的一个物理像素。这是一个假定在“中等”密度屏幕的基线密度。在运行时候,系统透明的处理任何缩放的DP单位,根据需要转化成屏幕的实际密度。dp的转化屏幕实际像素比较简单:px = dp * (dpi / 160)。例如,一个240dpi的屏幕上,1dp等于1.5的物理像素。定义你的应用程序UI的时候,你应该总是使用dp单位,以确保在不同密度的屏幕UI的正确显示
标准篇
Android1.6以前其实Android只支持一种屏幕——型号 T- Mobile G1 ,正常屏幕大小,中密度HVGA屏幕。
Android1.6(API level 4)提供的广义屏幕适配方式
为了适配越来越多的屏幕类型,Android1.6以后就以T- Mobile G1为基准定义了广义的尺寸和密度
如图1所示
图1:广义尺寸和广义密度范围
每个广义屏幕密度的上限
· ldpi (low) ~120dpi
· mdpi (medium) ~160dpi
· hdpi (high) ~240dpi
· xhdpi (extra-high) ~320dpi
· xxhdpi (extra-extra-high) ~480dpi
· xxxhdpi (extra-extra-extra-high) ~640dpi
每个广义尺寸的下限(Android3.0后才定义的,所以之前版本可能会有错误分类)
· xlarge screens are at least 960dp x 720dp
· large screens are at least 640dp x 480dp
· normal screens are at least 470dp x 320dp
· small screens are at least 426dp x 320dp
Android3.2提供的新的屏幕适配方式
因为大屏幕手机和小屏幕平板的出现,广义的分类方式不再适用与所有情况,因为一些可能被分类为同一类型的屏幕可能需要不同的体验,比如大屏幕手机和小屏幕平板按之前的标准都是large类型的,但是手机一般是单窗格布局,而平板一般是多窗格的。所以出现了Android3.2以后的更加精细控制的方式
新的大小限定符:
屏幕配置 |
限定符 取值 |
描述 |
smallestWidth |
sw |
你的设备两边较小的长度大于 比如你的设备屏幕尺寸为720*600dp 那么会使用sw600dp资源目录中的资源,但不会使用sw720dp资源目录中的资源 |
Available screen width |
w |
你的设备的宽度的取值大于 比如你的设备屏幕尺寸为720*600dp 如果你的720dp是宽度,那么会使用sw720dp资源目录中的资源,如果你的600dp是宽度那么就不会使用sw720dp中的资源 |
Available screen height |
h |
跟上述原理相同,所以一般可以不用这个属性
三种限定符中的N值可以任意指定,所以提供了一个更加灵活的布局方式 |
注意:使用新限定符需要在AndroidManifest.xml中添加
原理篇
Android系统为屏幕适配做了以下的工作:
1、屏幕密度独立:
1.1、系统根据当前的屏幕密度拉伸dp单位
1.2、系统根据当前的屏幕密度拉伸位图资源
2、采用合适的备选资源,否则进行适当的缩放
2.1、基于当前的屏幕搜索相关结构限定符的文件夹,比如当前屏幕密度是240dpi,那么就会搜索drawable-hdpi的文件夹
2.2、如果存在对应的文件夹,那么使用该文件夹下的内容
2.3、如果不存在对应的文件夹,系统会使用默认的资源缩放适配
注意:对于尺寸,系统会从小尺寸放大到大尺寸,只有大尺寸会引起崩溃,对于密度,系统从高密度缩小到低密度,只有低密度会引起图像模糊。
实践篇
屏幕适配原则
1、在XML布局文件中指定尺寸时,使用”wrap_content”,”fill_parent”或者dp单位(字体使用sp单位)
2、不要在程序代码或者xml文件中使用硬编码像素值
3、不要使用AbsoluteLayout,建议使用RelativeLayout,并且推荐使用weight来按比例布局
4、提供多套位图来绘制不同密度的图像,提供多套布局来适应不同尺寸的屏幕,见下所示
旧版的文件夹目录
res/layout/my_layout.xml // layout for normal screen size ("default")
res/layout-large/my_layout.xml // layout for large screen size
res/layout-xlarge/my_layout.xml // layout for extra-large screen size
res/layout-xlarge-land/my_layout.xml // layout for extra-large in landscape orientation
res/drawable-mdpi/my_icon.png // bitmap for medium-density
res/drawable-hdpi/my_icon.png // bitmap for high-density
res/drawable-xhdpi/my_icon.png // bitmap for extra-high-density
res/drawable-xxhdpi/my_icon.png // bitmap for extra-extra-high-density
res/drawable-nodpi/my_icon.png //bitmap for no scale
新版的文件夹目录
res/layout/main_activity.xml # For handsets (smaller than 600dp available width)
res/layout-sw600dp/main_activity.xml # For 7” tablets (600dp wide and bigger)
res/layout-sw720dp/main_activity.xml # For 10” tablets (720dp wide and bigger)
res/drawable/my_icon.png // bitmap for default
res/drawable-sw600dp/my_icon.png // bitmap for 600dp smallwidth
res/drawable-sw720dp/my_icon.png // bitmap for 720dp smallwidth
如果存在新旧方式并存,对于3.2以上的版本,一般会优先遵循新的分类,如果不符合再使用旧的分类方式,但也有可能会有问题