Android屏幕适配攻略

Android适配攻略html


1、屏幕适配的必要性java

为何Android须要适配?android

因为Android系统的开放性,任何用户、开发者、OEM厂商、运营商均可以对Android进行定制,修改为他们想要的样子。git

可是这种“碎片化”到底到达什么程度呢?api

在2012年,OpenSignalMaps(如下简称OSM)发布了第一份Android碎片化报告,统计数据代表,网络

               2012年,支持Android的设备共有3997种。app

               2013年,支持Android的设备共有11868种。ide

               2014年,支持Android的设备共有18796种。布局

       随着Android系统的设备(手机、平板、电脑、手表)的增多,设备碎片化、品牌碎片化、系统碎片化、传感器碎片化和屏幕碎片化的程度也在不断地加深。Android设备的屏幕尺寸,从几寸的智能手机,到10寸的平板电脑,再到几十寸的数字电视,咱们应该适配哪些设备?对于具备相同像素密度的设备来讲,相像素越高,尺寸越大,从单纯的尺寸大小转换到像素大小和像素密度的角度来。测试

而对咱们开发而言影响比较大的——屏幕碎片化


2、屏幕适配你所须要知道的

1,什么是屏幕尺寸?

         屏幕尺寸:实际的物理尺寸,指屏幕的对角线的长度(单位inch-英寸)。

         1英寸=2.54厘米。常见屏幕尺寸有2.四、2.八、3.五、3.七、4.二、5.0、5.五、6.0等。

         四种屏幕尺寸分类:小(small),正常(normal),大(large),超大(xlarge)。

2,什么是屏幕分辨率?

         屏幕分辨率:分为“图像分辨率”与“物理显示分辨率”;它们都是水平像素点数与垂直像素点数的乘积,也就是像素总和数。图像分辨率是指图片文件记录着自身全部的像素数。物理显示分辨率是指物理显示屏水平与垂直能显示的像素数的乘积。

         指在横纵向上的像素点数,单位是px,1px=1个像素点。通常以纵向像素*横向像素,如1960*1080。

3,什么是屏幕像素密度dpi?屏幕密度的划分?

         屏幕像素密度:指每英寸上的像素点数,点位dpi。

         屏幕像素密度与屏幕尺寸和屏幕分辨率有关。在单一变化条件下,屏幕尺寸越小、分辨率越高,像素密度越大,反之越小。

         标准是160dpi.即1dp=1个px,计算公式如:px = dp * (dpi / 160),屏幕密度越大,1dp对应的像素点越多。

         不一样设备有不一样的显示效果,这个和设备硬件有关通常咱们为了支持WVGA、HVGA和QVGA 推荐使用这 这个不依赖像素。 

         咱们能够根据长或者根据宽来计算出dpi,计算公式为:

                  dpi=宽/((尺寸^2 * 宽^2)/(宽^2 + 高^2))^(1/2)

                  = 长/((尺寸^2 * 长^2)/(宽^2 + 高^2))^(1/2)

为简单起见, Android中的全部实际的屏幕密度分为六个广义密度:

低(ldpi),中(mdpi),高(hdpi),超高(xhdpi),超超高(xxhdpi),超超超高(xxxhdpi)。

屏幕像素密度越大图片显示就越清晰。

4,什么是屏幕方向?

         从用户的角度看到的屏幕方向。通常为横向或纵向,即屏幕的宽高比。注意,不只要关注不一样的设备在缺省状况下的屏幕方向。同一设备当用户旋转时,应用程序的屏幕方向也须要关注。


5,Android系统的长度单位:

         px(像素)——终端上的一个物理像素点,例如,480*800的屏幕在横向有320个象素,在纵向有480个象素。

像素注解:

         一幅图片的显示就是由许多显示着不一样颜色的小方格组成的,这样的小方格就被称为像素,是构成图片的最小单位。像素的具体大小取决于显示这张图片的具体的物理设备显示一个图片像素点的荧光点的大小.图片文件只是记录着它自身有多少个像素点,每一个像素点显示什么颜色,至于它自身物理尺寸有多大,它自身也没法得知。

         例如一张480*800像素的图片在电脑显示器上显示明显要比在手机屏幕上显示大不少,而这张图片自己并无改变.只是手机的屏比电脑显示器的屏要精细许多,也就是每个物理像素点要小许多,密度也         就大许多.

         dip(dp)——这是Android开发中特有的一种度量,称做屏幕无关像素, 它不表示任何具体的长度或者像素点, 是一种基于屏幕密度抽象单位,被称做“设备独立像素”,会随着屏幕的密度进行自动的大小调整.

         dp和px如何换算呢?在Android中,规定以160dpi为基准,1dip=1px,若是密度是320dpi, 则1dip=2px,以此类推。

sp——比例像素,与dp相似,能够根据文字大小首选项进行放缩,主要处理字体大小。

in:英寸,标准长度单位

mm:毫米,标准长度单位

pt:磅,标准长度单位,1/72英寸

dp和px转换公式:px = dp * (dpi / 160)

英寸和厘米之间的转换公式:1英寸=2.54厘米

下图是2014年初,友盟统计的占比5%以上的6个主流分辨率,能够看出,占比最高的是480*800,320*480的设备居然也占据了很大比例,可是和半年前的数据相比较,中低分辨率(320*480、480*800)的比例在减小,而中高分辨率的比例则在不断地增长。虽然每一个分辨率所占的比例在变化,可是总的趋势没变,仍是这六种,只是分辨率在不断地提升。

                   

         因此说,咱们只要尽可能适配这几种分辨率,就能够在大部分的手机上正常运行了。

         这几种分辨率分别是:1280x720 、1920x1080、854x480、800x480、960x540、480x320

         不过通常状况下,咱们适配两三套就能够了,除非遇到特殊状况的手机,就根据特殊状况来适配。

 

3、配置限定符

配置限定符的名称:

几乎每一个应用程序应该提供替代的资源,以支持特定的设备配置。

1,建立一个新目录,在res/命名的形式<resources_name>-<config_qualifier>.

  • <resources_name>是相应的默认资源 (在表 1 中定义) 的目录名称。
  • <qualifier>是一个名称,指定个别配置,这些资源会被使用 (在表 2 中定义)。

您能够附加多个<qualifier>。分隔每一个替换为短划线。

谨慎:当追加多个限定符,你必须将它们放置在以下表 2 中列出的顺序相同。若是限定符是有错序,资源将被忽略。

表2:

附加:配置限定符名称

配置

限定符值

说明

MCC和MNC

例如: mcc310 mcc310-mnc004 mcc208-mnc00 等

MCC是移动国家代码的英文首字母缩写(The mobile country code),它的后面可选择性的跟随来自设备内的SIM卡的移动网络代码(MNC:mobile network code)。如在任何载体上,mcc310表明美国,mcc310-mnc004表明美国的Venizon公司,mcc208-mnc00表明法国的Orange公司。 若是设备使用音频链接(GSM 电话),那么MCC和MNC的值来自SIM卡。 也能够单独使用MCC(例如,在应用程序中包含特殊国家合法的资源)。若是仅须要指定语言环境,那么可使用language和region限定符来替代(稍后讨论)。若是决定要使用MCC和MNC限定符,就要仔细测试,使它可以知足你所指望的工做。 还能够查看配置域mcc和mnc,它们分别指示了当前的移动国家代码和移动网络代码。 mcc:http://developer.android.com/reference/android/content/res/Configuration.html#mcc mnc:http://developer.android.com/reference/android/content/res/Configuration.html#mnc

语言和地区

例如: en fr en-rUS fr-rFR fr-rCA

语言是用两个字母的ISO 639-1语言代码定义的,紧跟其后的是可选的两个ISO-3166-1-appha-2地区代码字母(前面是小写的“r”)。 这个编码不区分大小写,r前缀被用于区分地区部分,不可以单独指定地区。 若是用户改变了系统中的语言设置,那么在应用程序的运行期间也可以改变为对应的语言。

最小宽度

swdp 例如: sw320dp sw600dp sw720dp 等

屏幕的基本尺寸,是指最短的可用屏幕区域。具体的说,设备的最小宽度是屏幕可用的宽度和高度中最短的那个(也能够把它看作是屏幕的最小可能的宽度)。这样就可使用这个限定符来确保应用程序至少有dp的宽度可用于UI界面,而无论屏幕的当前方向。 例如,若是布局在任什么时候候都须要至少600dp的最小屏幕尺寸,那么就可以使用这个限定符,在res/layout-sw600dp/目录中建立布局资源。系统只会在可用屏幕的尺寸至少是600dp的时候才会使用这些资源,而无论600dp是不是被用户认知的高度或宽度。最小宽度是设备的固定屏幕尺寸特征,当屏幕的方向发生改变时,设备的最小宽度不改变。 设备的最小宽度须要考虑屏幕的装饰和系统UI的占用。例如,若是设备有一些固定的UI元素要沿着最小宽度的轴向,占用必定的屏幕空间,那么系统声明的最小宽度要比实际的屏幕尺寸要小,由于被系统占用的像素部分对用户应用程序的UI无效。所以,这个值应该是应用程序布局所须要的最小的实际尺寸(一般,这个值是布局支持的最小宽度,而无论屏幕的当前方向)。 如下是可使用的通用屏幕尺寸的一些值: 1.320,针对如下屏幕配置的设备:  240x320ldpi(QVGA手持设备)  320x480mdpi(手持设备)  480x800hdpi(高分辨率手持设备) 2.480,针对480x800mdpi的屏幕(平板或手持设备) 3.600,针对600x1024mdip的屏幕(7英寸平板) 4.720,针对720x1280mdip的屏幕(10英寸平板) 当应用程序提供了多个带有不一样值的最小宽度限定符资源目录时,系统会使用最接近(不超出)设备最小宽度的那个资源。 这个限定符被添加在API级别13中。 还要看android:requiresSmallestWidthDp属性,它声明了与你的应用程序兼容的最小的最小宽度,而且smallestScreenWidthDp配置字段会持有这个设备最小宽度的值。

可用宽度

wdp 例如: w720dp w1024dp 等

指定最小的可用屏幕宽度,在资源中应该以dp为单位来定义的值。当方向在横向和纵向之间改变时,这个配置值会跟当前的实际的宽度相匹配。 当应用程序给这个配置提供了多个不一样值的资源目录时,系统会使用最接近(不超过)设备当前屏幕宽度的那个配置。这个值须要考虑屏幕装饰占据的空间,所以,若是设备在显示的左边或右边有一些固定的UI元素,那么使用的宽度值就要比实际的屏幕尺寸小,由于这些固定UI元素的占用,使得应用程序的可用空间减小。 这个特性被添加在API级别13中 还要看screenWidthDp配置字段,它持有当前的屏幕宽度。

可用高度

hdp 例如: h720dp h1024dp 等

指定最小的可用屏幕高度,在资源中应该以dp为单位来定义的值,当方向在横向和纵向直接改变时,这个配置值应该跟当前的实际高度匹配。 当应用程序给这个配置提供了不一样值的多个资源目录时,系统会使用最接近(不超过)设备当前屏幕高度的那个配置。这个要考虑屏幕装饰的占用状况,所以,若是设备在显示的上方或底部有一些固定的UI元素,那么要使用的高度值要比实际的屏幕尺寸小,由于这些固定UI元素的占用,使得应用程序的可用空间减小。不固定的屏幕装饰(如电话的状态栏可以在全屏时被隐藏)是不考虑的,像标题栏或操做栏这样的窗口装饰也不考虑,所以应用必须准备处理比它们指定的空间要小的状况。 这个限定符被添加在API级别13中。 还要看screenHeightDp配置字段,它持有当前屏幕的高度。

屏幕尺寸

small normal large xlarge

small:这种屏相似低分辨率的QVGA屏幕。对于小屏的最小布局尺寸大约是320x426dp。例如QVGA低分辨率和VGA高分辨率。 normal:这种屏相似中等分辨率的HVGA屏幕。对于普通屏幕的最小布局尺寸大约是320x470dp。如,WQVGA低分辨率屏、HVGA中等分辨率屏、WVGA高分辨率屏。 large:这种屏相似中等分辨率的VGA屏幕,对于大屏幕的最小布局尺寸大约是480x640dp。例如VGA和WVGA的中等分辨率屏。 xlarge:这种屏被认为比传统的中等分辨率的HVGA屏幕大。针对xlarge屏的最小布局尺寸大约是720x960dp。在大多数状况下,这种超大屏幕的设备由于太大而要放到背包中来携带,并且最有可能的是平板样式的设备。 注意:使用尺寸限定符不意味着资源仅用于这个尺寸的屏幕。若是没有用限定符提供与当前设备配置相匹配的可选资源,那么系统会使用与配置最接近的资源。 警告:若是全部使用尺寸限定符的资源都比当前屏幕大,那么系统将不会使用它们,而且应用程序会在运行时崩溃(例如,若是全部的布局都被标记了xlarge限定符,而设备倒是一个普通尺寸的屏幕)。 这个限定符被添加在API级别4之后的版本中。

屏幕外观

long notlong

long:长屏幕,如WQVGA、WVGA、FWVGA notlong:非长屏幕,如QVGA、HVGA、VGA 这个限定符被添加在API级别4之后的版本中 这个限定符彻底是基于屏幕的外观比率,不相对屏幕的方向。 还要看screenLayout配置字段,它指示了屏幕是不是长屏。

屏幕方向

port land

port:纵向设备(垂直) land:横向设备(水平) 若是用户旋转屏幕,这个限定可以在应用程序运行期间改变。 orientation配置字段指示当前设备的方向。

泊位模式

car desk

car:设备停靠在汽车中 desk:设备停靠在书桌中 这个限定符被添加在API级别8之后的版本中 若是用户改变了设备的停靠地点,那么可以在应用程序的运行期间改变这个限定。可使用UiModeManager对象来启用或禁止这种模式。

夜间模式

night notnight

night:夜间 notnight:白天 被添加在API级别8之后的版本中 若是夜间模式被保留在自动模式中(默认),那么在应用程序运行期间,会基于白天的时间来进行模式的改变。可使用UiModeManager对象来启用或禁止这种模式。

屏幕像素密度(dpi)

ldpi mdpi hdpi xhdpi nodpi tvdpi

ldpi:针对大约120dpi的低分辨率屏幕; mdpi:针对大约160dpi的中等分辨率屏幕(在传统的HVGA上); hdpi:针对大约240dpi的高分辨率屏幕; xhdpi:针对大约320dpi的超高分辨率屏幕,被添加在API基本8之后的版本中; nodpi:这个限定被用于不想根据匹配的设备分辨率进行缩放的位图资源。 tvdpi:在mdpi和hdpi之间的屏幕,大约是213dpi。这种分组不是主要的分辨率,大多数是为电视来考虑的,而且大多数应用不须要它---提供mdpi和hdpi资源就能够知足大多数应用程序须要了,而且系统会适当的缩放它们。这个限定符在API级别13之后被引入。 四种主要的分辨率之间的缩放比例是:3:4:6:8(忽略tvdpi分辨率),所以一个9x9的ldpi位图,在mdpi中是12x十二、在hdpi中是18x1八、在xhdpi中是24x24。 若是感受在电视或其余某些设备上的图片资源很差看,而且想要试用tvdpi资源,那么缩放因子是1.33*mdpi。例如,一个100px x 100px的mdpi图片的图片应该被放大成133px x 133px的tvdpi图片。 注意:使用分辨率限定符不意味着资源仅适用与对应分辨率的屏幕。若是没有提供与当前设备配置匹配的可选资源,那么系统会使用最接近的资源。

触屏类型

notouch stylus finger

notouch:非触屏设备 stylus:有适用手写笔的电阻屏设备 finger:触屏设备 touchscreen配置字段,指示到了设备上的触屏类型。

键盘可用性

keysexposed keyshidden keyssoft

keysexposed:设备有可用的键盘。若是设备启用了软键盘,那么即便在硬键盘没有暴露给用户时也可使用这个限定符。若是没有提供软键盘或者软键盘被禁用,那么只有在硬键盘被暴露给用户时才可以使用这个限定符。 keyshidden:设备有可用的硬键盘,可是被隐藏了,而且设备没有可用的软键盘。 keyssoft:设备有可用的软键盘,无论它是否可见。 若是提供了keysexposed资源,但没有keyssoft资源,那么只要系统有可用的软键盘,系统就会使用keysexposed资源而无论键盘是否可见。 若是用户打开了硬键盘,就能够在应用程序运行期间改变这个限定。 hardKeyboardHidden和keyboardHidden配置字段分别指明硬键盘的可见性以及可见的键盘类型(包括软键盘)。

主要文本输入法

nokeys qwerty l2key

nokeys:设备没有用于文本输入的硬键盘; qwerty:设备有标准的硬键盘,无论用户是否可见; 12key:设备有12个键的硬键盘,无论用户是否可见。 keyboard配置字段指明可用的主要文本输入方法。

导航键的有效性

navexposed navhidden

navexposed:导航键对用户可用; navhidden:导航键不可用。 若是用户可以看到导航键,那么在应用程序运行时就可以改变这个限定。 navigationHidden配置字段,指示导航键是否隐藏。

主要的非触屏导航方法

nonav dpad trackball wheel

nonav:除了使用触屏之外,设备没有其余导航设施。 dpad:设备有用于导航的定向板(d-pad)。 trackball:设备有用于导航的轨迹球 wheel:设备有用于导航的定向滚轮(不常见)。 navigation配置字段指明可用的导航方法类型。

平台版本(API 级别)

例如: v3 v4 v7 等

设备支持的API级别。如v1表明API级别1(带有Android1.0或更高版的设备),v4表明API级别4(带有Android1.6或更高版本的设备) 警告:Android1.5和1.6只有在限定符跟平台版本彻底匹配时,才能匹配资源

 

以上所写的限定符只是简单介绍,主要是为了得知限定符的顺序,要看完整列表,请到官网限定符url:http://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources

 

2,在这新的目录中保存各自的替代资源。资源文件必须命名的默认资源文件彻底相同。

          


         Android 支持几个配置限定符,你能够将多个限定符添加到一个目录名称,经过用短划线分隔每一个限定符。按优先级顺序 — — 若是你使用多个限定符资源目录,你必须将他们添加到表中列出的顺序中的目录名称。

3,配置限定符的名称列表,

(1)配置:MCC和跨国公司 

限定符值:如mcc310(是美国在任何载体上)、mcc310-mnc004(是美国Verizon)、mcc208-mnc00(是法国上橙色)等;

(2)配置:语言和区域

限定符值:如en、fr、rn-rUS、fr-rFR、fr-rCA等;

(3)配置:布局方向:你的应用程序布局方向

限定符值:

ldrtl “布局-方向-右到左”如文件名:res/layout/layout-ldrtl/

ldltr    “布局-方向-左到右”如文件名:res/layout/layout-ldltr/

注:若要为您的应用程序启用从右向左布局功能,必须将supportsRtl设置为"true" ,并将targetSdkVersion设置为 17 或更高。

(4)配置:smallestWidth——基本大小的保障,可用的屏幕区域的最短尺寸所示

限定符值:sw320dp、sw600dp、sw720dp等

例如,若是您的布局要求,其最小尺寸的屏幕区域至少 600 dp 在任什么时候候,而后你可使用这个 qualifer 建立布局资源, res/layout-sw600dp/。系统将使用这些资源时,才可用屏幕的最小尺寸至少 600dp,不管 600dp 侧是用户感知的高度或宽度。SmallestWidth 是设备的一个固定的屏幕大小特征;设备的 smallestWidth 不会更改屏幕方向更改时.

(5)配置:可用宽度——指定最小的可用屏幕宽度, dp单位应使用资源 — — 由<N>值定义。

此配置值会改变方向之间横向和纵向以匹配当前的实际宽度发生变化时。

限定符值:w720dp、w1024dp等

(6)配置:可用高度——最低可用的屏幕高度,指定应该使用该资源的"dp"单位 — — 由<N>值定义。

此配置值会改变方向之间横向和纵向以匹配当前的实际高度发生变化时。

限定符值:h720dp、h1024dp等

(7)配置:屏幕大小

限定符值:

small : 到低密度的 QVGA 屏幕大小类似的屏幕。

normal :中等密度 HVGA 屏幕大小类似的屏幕。

large :中等密度 VGA 屏幕大小类似的屏幕。

xlarge :大大大于传统介质密度 HVGA 屏幕的屏幕

(8)配置:圆形屏幕

限定符值:

round  圆如圆可穿戴设备的屏幕

notround 矩形屏幕,如手机或平板电脑

(9)配置:屏幕方向

限定符值:

port 设备是纵向 (垂直)

land 设备是横向 (水平)

(10)配置:用户界面模式

限定符值:

car  把车停靠在展现设备

desk  设备显示在一个桌子上码头

television  设备显示在电视上提供其 UI 在哪里用户距离遥远的大屏幕的"十脚"经验,

                  主要围绕 DPAD 或其余非指针交互。

appliance  设备服务做为一种装置,与无显示

watch  设备具备显示和戴在手腕上

(11)配置:夜间模式

限定符值:

night   晚上的时间

notnight  一天时间

(12)配置:屏幕像素密度

限定符值:

ldpi    低密度屏幕;大约 120 dpi。

mdpi    中等密度 (在传统的 HVGA) 屏幕;大约 160 dpi

hdpi    高密度屏幕;大约 240 dpi

xhdpi   Extra-high-density 屏幕;大约 320 dpi。添加在 API 级别 8

xxhdpi  外超高密度屏幕;大约 480 dpi。添加在 API 级别 16

xxxhdpi 超-超额外--高密度用途 (启动器图标,只见在支持多屏幕的注意);大约 640 dpi。添加在 API 级别 18

nodpi   这能够用于你不想要缩放,以匹配设备密度的位图资源

tvdpi   屏幕介于 mdpi 和下;约 213 dpi。这不是"主"密度组。它主要用于电视机和大多数应用程序不该该须要它

(13)配置:触摸屏类型

限定符值:

notouch     设备没有触摸屏

finger      设备已打算用于经过用户的手指的双向互动的触摸屏。此外看到touchscreen配置字段,

               指示设备上的触摸屏的类型。

 

(14)配置:键盘可用性

限定符值:

keysexposed     设备有可用的键盘。

keyshidden      设备具备可用的硬件键盘,但它是隐藏和设备不启用软件键盘。

keyssoft        设备已启用,软件键盘是否可见。

(15)配置:主要文本输入法

限定符值:

nokeys    设备有没有硬件键进行文本输入。

qwerty    设备具备一个硬件 qwerty 键盘,是否对用户可见。

12key     设备具备硬件 12 键键盘,是否对用户可见。

(16)配置:导航关键可用性

限定符值:

navexposed    导航键是提供给用户。

navhidden     导航键不可用 (如背后密封盖子)。

(17)配置:主的非接触式导航方法

限定符值:

nonav     设备有没有使用触摸屏的导航设施。

dpad      设备具备定向垫 (d-垫) 为导航

trackball 设备已用于导航的轨迹球

wheel     设备已用于导航 (罕见) 定向 (第)。

(18)配置:平台版本(API级别)

限定符值:v三、v四、v7等。

4,限定符命名规则:

(1)能够指定一组资源,以短划线分隔的多个限定符;

(2)限定符必须在表 2中列出的顺序。例如:

    错误:drawable-hdpi-port/

    正确:drawable-port-hdpi/

(3)不能嵌套替代资源目录。例如,您不能有res/drawable/drawable-en/.

(4)值不区分大小写。资源编译器前处理,以免在不区分大小写的文件系统上的问题,将目录名称转换为小写字母。

          名称中的任何大写只是受益的可读性。

(5)支持每一个限定符类型只有一个值。例如,若是您想要使用相同的可绘制文件为西班牙和法国,你不能有一个名为

         目录drawable-rES-rFR/。相反你须要两个资源目录,如drawable-rES/和drawable-rFR/,其中包含相应的文件。


5,下面是用常见的一些类型的手机总结的一个表格,能够简单作一下参考


 

4、屏幕的分类

1)以总像素数分,文本的size等都要改,以下图所示: 

每个分类都有其最小分辨率,以下,可根据分辨率划分种类: 

2)以屏幕密度分,提供不一样的图片,以下图所示: 


5、屏幕的适配

掌握了以上的知识,咱们如今开始来对Android进行屏幕适配:

        Android的多屏幕支持的基础是它可以根据当前屏幕配置以适当的方式管理提出申请的布局和位图渲染能力。

系统处理的大部分工做是以适应屏幕尺寸/密度缩放布局和扩展位图以适应屏幕像素密度。

你应该确信你应用程序布局:

         适合在小屏幕 (这样用户实际上可使用您的应用程序)

         为更大的屏幕,以利用额外的屏幕空间优化

         针对横向和纵向方向优化。


1,在manifest中显示声明应用程序支持的屏幕尺寸清单

设置多分辨率支持,代码以下所示:

              <supports-screens

                    android:anyDensity="true"

                    android:largeScreens="true"

                    android:normalScreens="true"

                    android:resizeable="true"

                    android:smallScreens="true" />

注解:

        android:anyDensity="true",系统会依据屏幕密度,自动去找对应的文件夹


        android:requiresSmallestWidthDp

        android:compatibleWidthLimitDp

        android:largestWidthLimitDp

以上这三个属性也是写在supports-screens中,但咱们通常不用它,这里就很少作解释了,若想要了解详情请查看连接:http://developer.android.com/guide/practices/screens_support.html


2,图片适配

        为不一样的屏幕密度提供不一样的位图画板。不一样像素密度的手机加载工程资源文件(res)中不一样资源图片。Android有个自动匹配机制去选择对应的布局和图片资源

使用自动拉伸的位图

        默认状况下,Android 缩放你位图画板 (.png、 .jpg和.gif文件) 和九补丁画板 (.9.png文件),以便它们呈如今每一个设备上的适当的物理大小。

位图资源,也就是图片资源。

     以使用为特定密度资源是ldpi (低), mdpi (中等)、hdpi(高), xhdpi超高), xxhdpi (extra-extra-high) 和xxxhdpi (extra-extra-extra-high)

注:mipmap-xxxhdpi限定符是只须要提供能够出现比日常 xxhdpi 设备上较大的启动器图标。你不须要为应用程序的全部图像提供 xxxhdpi 资产。想要了解高密度启动器图标,请点击链接:http://developer.android.com/guide/practices/screens_support.html
大小和密度配置限定符对应的广义的大小和密度在屏幕支持范围。

从Android 1.6 ( API 4 )开始, Android提供了多种屏幕尺寸和密度,反映了多种不一样的设备可能支持屏幕配置。

Android把实际的屏幕尺寸和密度分红以下范围:

官方指定标准:     




       虽然Android也支持低像素密度(LDPI)的屏幕,但无需为此费神,系统将自动将HDPI尺寸的图标缩小到1/2进行匹配。

好比下面就是一些在各个屏幕密度里面的尺寸:

按照以上计算方式,大体能够将市场上的手机划分为5个像素密度等级,具体以下:

(1)     ldpi:120dpi,像素密度与dp转换关系为:1dp = 0.75px

(2)     mdpi:160dpi ,像素密度与dp转换关系为:1dp = 1px

(3)     hdpi:240dpi,像素密度与dp转换关系为:1dp = 1.5px

(4)     xhdpi:320dpi,像素密度与dp转换关系为:1dp = 2px

(5)     xxhdpi:480dpi,像素密度与dp转换关系为:1dp = 3px



咱们可以使用屏幕像素密度限定符来建立不一样的图片文件夹,以下图所示:


注意:上图各类文件夹的不一样表示。

drawable-hdpi 该图片即适用于横屏,也适用于竖屏

drawable-land-hdpi,当屏幕为横屏,且为高密度时,加载此文件夹中的资源

drawable-port-hdpi,当屏幕为竖屏,且为高密度时,加载此文件夹中的资源


ldpi、mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi:像素密度比例缩放为1:2:3:4:6:8

       在有关图片的适配时,咱们须要把合适大小的图片放在合适的位置,以下图所示:

支持多个屏幕的目的是建立一个应用程序能够正常工做,能够在任何支持的安卓系统的广义的屏配置看起来不错。


关于高清设计图尺寸

       Google官方给出的高清设计图尺寸有两种方案,一种是以mdpi设计,而后对应放大获得更高分辨率的图片,另一种则是以高分辨率做为设计大小,而后按照倍数对应缩小到小分辨率的图片。据经验,我更推荐第二种方法,由于小分辨率在生成高分辨率图片的时候,会出现像素丢失,我不知道是否是有方法能够阻止这种状况发生。

而分辨率能够以1280*720或者是1960*1080做为主要分辨率进行设计。


Android 寻找最佳资源原理: 

1, 排除与设备设置不符合的资源 

2, 根据限定词(qualifier)的优先级,按照顺序查找 

3, 在限定词下,是否存在资源路径 

4, 排除不包含在限定词中的资源路径 

5,  继续执行不一样的限定词查找,直到找到相应的资源 

         详细解释:

(1)首先会去比本身密度高的目录里去找,这是由于由于系统相信,你在密度更高的目录里会放置分辨率更

大的图片,这样的话这个图片会被缩小,但同时显示效果不会有损失,可是若是优先去低一级别的目录去找的话,找到的图片就会被放大,这样的话这个图片就会被拉扯模糊了。

e.g. 同一张图片,你在mdpi和xxhdpi目录各放了一份, 这个应用你如今运行在hdpi的手机上, 那应用会选择哪张图片呢。答案是xxhdpi目录里的。即使hdpi离mdpi更近一点!

(2)若是在mdpi里找不到是不会直接去ldpi里找的, 而是先去默认的drawble目录里找,这是drawble目录

和drawble-mdpi是一个级别的。

(3)若是drawable-hdpi,drawable-mdpi,drawable-ldpi三个文件夹中有同一张图片资源的不一样密度表示,

那么系统会去加载drawable_mdpi文件夹中的资源。

(4)若是drawable-hpdi中有高密度图片,其它两个文件夹中没有对应图片资源,那么系统会去加载

drawable-hdpi中的资源。

(5)若是drawable-hdpi,drawable-mdpi中有图片资源,drawable-ldpi中没有对应的图片资源,

那么系统会加载drawable-mdpi文件夹中的资源 。


3,布局文件适

为不一样的屏幕尺寸提供不一样的布局。
根据配置限定符,你能够用它来提供大小的特定资源,好比小,正常,大和超大 。

例如,超大屏幕布局应该在文件夹layout-xlarge /下面 。
       从Android 3.2 ( API等级13 )起,上述尺寸组已过期,应改用sw dp配置限定符来定义你的布局资源所需的最小可用宽度。例如,若是你的平板电脑的布局至少须要600dp屏幕宽度,你应该把它放在文件夹layout-sw600dp /下 。在有关平板布局的声明在Android 3.2节进一步讨论。

布局可使用的限定符是:
         smallestWidth——基本大小的保障,可用的屏幕区域的最短尺寸所示:
         sw320dp、sw600dp、sw720dp等

屏幕大小:small、normal、large、xlarge
屏幕方向:port(垂直)、land(水平)

实际的物理尺寸,指屏幕的对角线的长度(单位inch-英寸)。
1英寸=2.54厘米。常见屏幕尺寸有2.四、2.八、3.五、3.七、4.二、5.0、5.五、6.0等

可建立的layout:如有layout-normal和layout-1920x12080的话,会执行layout-normal,

下面是布局layout根据限定配置符所建立的文件:

   

注意:里面的布局文件名相同,文件里面的控件id也是相同

        对于最小宽度大于等于 600 dp 的设备,系统会选择 layout-sw600dp/main.xml(双面板)布局,不然系统就会选择 layout/main.xml(单面板)布局。

        但 Android 版本低于 3.2 的设备不支持此技术,缘由是这些设备没法将 sw600dp 识别为尺寸限定符,所以咱们仍需使用 large 限定符。这样一来,就会有一个名称为 res/layout-large/main.xml 的文件(与 res/layout-sw600dp/main.xml 同样)

注意:能够查询一下API所对应的版本,13表明的是3.2版本


注意:当你使用多个限定符时要按照限定符顺序,不然,资源将被忽略。

 

这里是关于如何你能够确保您的应用程序在不一样的屏幕上显示正确的快速清单:

       (1)不要使用绝对布局

  (2)尽可能使用match_parent 而不是fill_parent 。

  (3)可以使用权重的地方尽可能使用权重(android:layout_weight)

  (4)若是是纯色背景,尽可能使用android的shape 自定义。

  (5)若是须要在特定分辨率下适配,能够在res目录上新建layout-HxW.xml的文件夹。好比要适配1080*1800的屏幕(魅族MX3采用此分辨率)则新建layout-1800x1080.xml的文件夹,而后在下面定义布局。Android系统会优先查找分辨率相同的布局,若是不存在则换使用默认的layout下的布局。

       (6)ImageView的ScaleType属性

               设置不一样的ScaleType会获得不一样的显示效果,通常状况下,设置为centerCrop能得到较好的适配效果。

        注意:

              使用 “wrap_content”,系统就会将视图的宽度或高度设置成所需的最小尺寸以适应视图中的内容,而 “match_parent”(在低于 API 级别 8 的级别中称为 “fill_parent”)则会展开组件以匹配其父视图的尺寸。若是使用 “wrap_content” 和 “match_parent” 尺寸值而不是硬编码的尺寸,视图就会相应地仅使用自身所需的空间或展开以

填满可用空间。此方法可以让布局正确适应各类屏幕尺寸和屏幕方向。

示例代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

    tools:context="com.student.android_screenadaptation.MainActivity" >


    <TextView

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="     为了屏幕的多适配,咱们能够要多用

        match_parent或wrap_content,以及下面布局

     中的线性布局的android:layout_weight属性," />


    <LinearLayout

        android:layout_width="match_parent"

        android:layout_height="0dp"

        android:layout_weight="2.0"

        android:background="@color/gw_dark_orange"

        android:gravity="center"

        android:orientation="horizontal" >


        <TextView

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="这边占用了2份" />

    </LinearLayout>


    <LinearLayout

        android:layout_width="match_parent"

        android:layout_height="0dp"

        android:layout_weight="1.0"

        android:background="@color/gw_default_blue"

        android:gravity="center"

        android:orientation="horizontal" >


        <TextView

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:text="这边占用了1份" />

    </LinearLayout>


</LinearLayout>


显示的效果:


在开发中,咱们大部分时候使用的都是线性布局、相对布局和帧布局,绝对布局因为适配性极差,因此极少使用。

 

3,dimens.xml文件适配

      Value所建立的文件夹及文件以下所示:

具体状况就不说了,下面的这个博客连接里面讲解的很清楚,你们能够参考:

http://blog.csdn.net/lmj623565791/article/details/45460089

 

4,java代码适配

       经过android相应api获取当前手机的宽高像素值,按比例分配屏幕中控件的宽高以达到适配效果。

       下面是布局和实现功能的核心代码:

获取屏幕尺寸:

      /* 定义DisplayMetrics对象 */

        DisplayMetrics dm = new DisplayMetrics();

        /* 取得窗口属性 */

        getWindowManager().getDefaultDisplay().getMetrics(dm);

        /* 窗口的宽度 */

        int screenWidth = dm.widthPixels;

        /* 窗口的高度 */

        int screenHeight = dm.heightPixels;

 

Android全屏显示、横竖屏设置:

通常程序在运行时屏幕顶部都带有标题栏和系统信息栏

但在游戏开发时为了美观,咱们就须要全屏显示:

经过requestWidowFeature方法能够设置标题栏是否显示,经过setFlags方法能够设置全屏模式

经过setRequestedOrientation方法将显示模式设置为横屏模式。

@Override

    public void onCreate(Bundle savedInstanceState)

    {

        super.onCreate(savedInstanceState);

        /* 设置为无标题栏 */

        requestWindowFeature(Window.FEATURE_NO_TITLE); 

        /* 设置为全屏模式 */ 

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

        /* 设置为横屏 */

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

        setContentView(R.layout.main);

    }



 Android屏幕适配项目模板下载地址:https://git.oschina.net/22889/Android_ScreenSmartScale.git

仅供参考,若是您有更好的方法,欢迎讨论,欢迎分享