android屏幕适配详解

android屏幕适配详解html

官方地址:http://developer.android.com/guide/practices/screens_support.htmlandroid

 

1、关于布局适配建议网络

一、不要使用绝对布局
二、尽可能使用match_parent 而不是fill_parent 。
三、可以使用权重的地方尽可能使用权重(android:layout_weight)
四、若是是纯色背景,尽可能使用android的shape 自定义。
五、若是须要在特定分辨率下适配,能够在res目录上新建layout-HxW.xml的文件夹。好比要适配1080*1800的屏幕(魅族MX3采用此分辨率)则新建layout-1800x1080.xml的文件夹,而后在下面定义布局。Android系统会优先查找分辨率相同的布局,若是不存在则换使用默认的layout下的布局。
 

2、术语和概念app

四种屏幕尺寸分类:: small, normal, large, and xlargeide

四种密度分类: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high)工具

须要注意的是: xhdpi是从 Android 2.2 (API Level 8)才开始增长的分类.布局

xlarge是从Android 2.3 (API Level 9)才开始增长的分类.post

DPI是“dot per inch”的缩写,每英寸像素数。测试

通常状况下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。ui

 

3、如何作到自适应屏幕大小呢?

1)界面布局方面

   须要根据物理尺寸的大小准备5套布局,layout(放一些通用布局xml文件,好比界面中顶部和底部的布局,不会随着屏幕大小变化,相似windos窗口的title bar),layout-small(屏幕尺寸小于3英寸左右的布局),layout-normal(屏幕尺寸小于4.5英寸左右),layout-large(4英寸-7英寸之间),layout-xlarge(7-10英寸之间)

2)图片资源方面

  须要根据dpi值准备5套图片资源,drawable,drawalbe-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi

Android有个自动匹配机制去选择对应的布局和图片资源

 

4、两种获取屏幕分辨率信息的方法:

DisplayMetrics metrics = new DisplayMetrics(); Display display = activity.getWindowManager().getDefaultDisplay(); display.getMetrics(metrics); //这里获得的像素值是设备独立像素dp

//DisplayMetrics metrics=activity.getResources().getDisplayMetrics(); 这样得到的参数信息不正确,不要使用这种方式。 不能使用android.content.res.Resources.getSystem().getDisplayMetrics()。这个获得的宽和高是空的。

 

5、关于图片制做

1)关于设计:
设计图先定下一个要设计的尺寸,并且尽可能采用在目前最流行的屏幕尺寸(好比目前占屏幕比重比较多的是480系列,也便是480*800或者400*854,下面的图标制做也在次基础上进行比例的换算)上设计。
先了解一下屏幕的级别:
屏幕级别
屏幕密度
比率(相对)
物理大小(英寸)
像素大小
一般的分辨率
ldpi
120
3
0.75
1
120
 
mdpi
160
4
1
1
160
320*480
hdpi
240
6
1.5
1
240
480*800
xhdpi
320
8
2
1
320
720*1280
xxhdpi
480
12
3
1
480
1080*1800
说明:
屏幕级别:
注意屏幕级别是按照密度分级,和像素没有关系。若是非要让密度和像素扯上关系,则须要一个参照系,android使用mdpi级别做为标准参照屏幕,也就是说在320*480分辨率的手机上一个密度能够容纳一个像素。而后其余密度级别则在此基础上进行对比。若是理想状况下,480*800的屏幕一个密度能够容纳1.5个像素。
物理大小:
单位是英寸而不是像素,也就说一个英寸在任何分辨率下显示的大小都是同样的,可是像素在密度不一样的手机里面显示的实际的大小是不同的(这就是为何android手机须要适配的缘由)。
而后就是重点。
假设1像素在160密度下显示1英寸,则1像素在240密度基础上显示大约0.67英寸,在320密度下显示0.5英寸。因而就出现一种状况,在电脑上的一个像素,在不一样的手机上看实际的大小不同。那么怎么让“设计效果”在不一样的手机上看起来显示的区域同样呢?
仍是假设一个像素在160密度下的显示在一个密度内,也假设就是一英寸。那么须要几个像素才能在240密度级别下显示在一英寸范围内呢?答案是1.5个像素(根据上图的比率换算)。
了解了这个关系,接下来就是图标的制做。
2)关于切图。
关于切图有几个建议:
第一,长宽最好是3的倍数(根据android的推荐logo图标的大小是48(mdpi),72(hdpi),96(xhdpi)得出的最小公约数)。
第二,长宽最好是偶数。由于奇数在进行等比压缩的时候可能有问题。
第三,根据上面两条,若是长宽是6的倍数最理想。
第四,若是能够拉伸而不改变设计意图的状况下,好比纯色背景,则使用android的9path工具制做成.9的图片。
3)关于图标的适配。
而后接下来的一切就和设计稿没什么关系。在切好图的基础上,根据屏幕密度、像素和实际大小的比例关系。假如设计司在480*800的分辨率下作好了设计图,而且切好图,若是你须要适配720*1280屏幕,该怎么作?根据比例,他们的关系是2:3,因而你须要按照1.5倍比例制做图标,好比你在480*800的设计稿上切下来一个20*20像素的图,那么你就须要制做一个等比放大成30*30像素的图标,这样同一个图标在480*800的屏幕和720*1280的屏幕上显示的实际大小才同样。同理,若是你须要适配xxhdpi则须要在20*20的基础上制做一个等比放大成40*40像素的图标。
4)关于图标的目录,480*800切下来的图咱们放在drawable-hdpi目录下,按照2:3放大的图标放在drawable-xhdpi目录下,按照2倍放大的图标放在drawable-xxhdpi目录下。
android会根据手机的密度优先查找对应的目录的资源,
好比408*800分辨率下的手机若是密度是160,则自动加载drawable-hdpi这个目录下的图标,
若是720*1280密度是240的手机自动加载drawable-xhdpi这个目录下的图标。若是没有这个文件夹,则查找和240最接近的对应密度文件夹。
5)其它
接下来要说的估计会让你失望,根据上面的步骤也不能彻底解决适配的问题,只能是大概适配,而就算根据上面的步骤大概适配了,实际在手机上的效果也有出入。
好比魅族MX3的分辨率是1080*1800,标准状况下密度是480,可是他的密度大约是524,和480接近,也就是会查找drawable-xxhdpi这个资源下的文件。也就是说你在480*800分辨率下切图而后按两倍放大的图标在这台手机上显示的效果仍是比实际的小。
而另外一个要说的问题是540*960或者640*960,他们的密度极可能是或者接近240也多是320。因而在480*800的设计稿上切下来的图而且进行的适配制做,在这些手机上显示的实际大小也可能或大或小。
综上所述,我也只是把个人理解和经验分享一下,可是并不能完美适配屏幕,仅仅当作抛砖引玉,若是您路过而且看到这份建议,若是你正好有更好的方案可以进行适配,请不吝赐教。
 
在代码中获取屏幕像素、屏幕密度  DisplayMetrics metric = new DisplayMetrics();  getWindowManager().getDefaultDisplay().getMetrics(metric);  int width = metric.widthPixels; // 屏幕宽度(像素)  int height = metric.heightPixels; // 屏幕高度(像素)  float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)  int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240) 
 

DPI是“dot per inch”的缩写,每英寸像素数。 通常状况下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。 参考:http://developer.android.com/images/screens_support/screens-ranges.png

 

附加:配置限定符名称

配置 限定符值 说明
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前缀被用于区分地区部分,不可以单独指定地区。 若是用户改变了系统中的语言设置,那么在应用程序的运行期间也可以改变为对应的语言。
最小宽度 sw<N>dp 例如: sw320dp sw600dp sw720dp 等 屏幕的基本尺寸,是指最短的可用屏幕区域。具体的说,设备的最小宽度是屏幕可用的宽度和高度中最短的那个(也能够把它看作是屏幕的最小可能的宽度)。这样就可使用这个限定符来确保应用程序至少有<N>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配置字段会持有这个设备最小宽度的值。
可用宽度 w<N>dp 例如: w720dp w1024dp 等 指定最小的可用屏幕宽度,在资源中应该以dp为单位来定义<N>的值。当方向在横向和纵向之间改变时,这个配置值会跟当前的实际的宽度相匹配。 当应用程序给这个配置提供了多个不一样值的资源目录时,系统会使用最接近(不超过)设备当前屏幕宽度的那个配置。这个值须要考虑屏幕装饰占据的空间,所以,若是设备在显示的左边或右边有一些固定的UI元素,那么使用的宽度值就要比实际的屏幕尺寸小,由于这些固定UI元素的占用,使得应用程序的可用空间减小。 这个特性被添加在API级别13中 还要看screenWidthDp配置字段,它持有当前的屏幕宽度。
可用高度 h<N>dp 例如: h720dp h1024dp 等 指定最小的可用屏幕高度,在资源中应该以dp为单位来定义<N>的值,当方向在横向和纵向直接改变时,这个配置值应该跟当前的实际高度匹配。 当应用程序给这个配置提供了不一样值的多个资源目录时,系统会使用最接近(不超过)设备当前屏幕高度的那个配置。这个要考虑屏幕装饰的占用状况,所以,若是设备在显示的上方或底部有一些固定的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只有在限定符跟平台版本彻底匹配时,才能匹配资源
 
相关文章
相关标签/搜索