总结一下自己的适屏经验,仅仅希望自己不断进步,不断完好,假设有热心肠的“前辈”指导一下,不胜感激!
Android5.0已经出来了,说是这个版本号对Android屏幕适配做了非常多工作,只是对于我这样的慢性子的人,我还是耐心的拭目以待吧,5.0之前已经有非常多分辨率,刚開始做Android的时候头都大了,只是慢慢的还是积累了一些适屏的经验。在此总结一下。
一、使用资源标识
1.分辨率(密度)标识符适配
Android的分辨率有四大类。以后还会不会很多其它呢,我也不知道。只是话说分辨到达一定阈值后人眼就不能分辨了吧。毕竟在手机这么小的屏幕之上,再仔细也就不值得了
低分辨率:lhdp(120dp)
普通分辨率:mdp(160dp)
高分辨率:hdp(240dp)
超高分辨率:xhdp(320dp)
超级高分辨率:xxhdp(480dp) 这是API Lev 16之后才有的超级分辨率
分辨率的不同主要影响Android手机上图片的显示。假设是一些颜色或者矢量背景就没有影响,比方直接用color或者定义xml类型的drawable做视图的背景时,结合布局时的一些技巧就不会受分辨率的影响了。抽出时间再总结,话说回来,用上面的资源标识符为图片提供多种尺寸的方法例如以下:
将资源标识符用短横线连接到res/drawable之后,比如:
res/drawable-lhdp/:正常图片尺寸的75%
res/drawable-hdp/:正常图片尺寸的100%
res/drawable-hhdp/:正常图片尺寸的150%
res/drawable-xhdp/:正常图片尺寸的200%
res/drawable-xhdp/:正常图片尺寸的300%
就像应用程序的启动图片。也应该设置多个分辨率类型,将36*36(像素),48*48(像素),72*72(像素),96*96(像素),144*144(像素)的icon分别放在以上相应的项目文件文件夹下就可以实现不同分辨率下,显示相相应的图片。
屏幕级别
|
屏幕密度
|
比率(相对)
|
物理大小(英寸)
|
像素大小
|
通常的分辨率
|
|
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
|
2.尺寸资源标识符适配
small:426*320(dp)
normal:470*320(dp)
large:640*480(dp)
xlarge:960*720(dp)
有xxlarge:吗?
3.平台标识符限定
v4
v9
v11
v14
...
4.横竖屏标识符限定
land
5.精确限定
w<N>dp:精确限定宽度分辨率
h<N>dp:精确限定高度分辨率
sw<N>dp:表示这个layout目录以下的布局文件仅仅有在设备短边的最小宽带为N时才载入。
你的设备是800x480的分辨率。那么这个apk安装在你的设备上就会载入 layout-sw480dp里面的布局文件。
上面的标识符通经常使用在res文件文件夹下的drawable,layout和values,比如:layout-550dp-large;drawable-large-mdpi;values-1134*720(大数在前小数在后)
除了上面的资源标识符限定之外,假设想要更加精确的设置,能够利用values下的dimen。对于要求不是非常严格的。能够结合Relativeyout,LinearLayout,还有easy被忽视的FrameLayout,设置视图的宽高(android:layout_width="" android:layout_height="")时使用match或者wrap,之后再设置layout_margin=""或者padding=""属性来控制距离。
6.限定符
配置 | 限定符值 | 说明 |
MCC和MNC | 比如: mcc310 mcc310-mnc004 mcc208-mnc00 等 |
MCC是移动国家代码的英文首字母缩写(The mobile country code),它的后面可选择性的尾随来自设备内的SIM卡的移动网络代码(MNC:mobile network code)。如在不论什么载体上,mcc310代表美国。mcc310-mnc004代表美国的Venizon公司。mcc208-mnc00代表法国的Orange公司。
|
语言和地区 | 比如: 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的时候才会使用这些资源,而无论600dp是否是被用户认知的高度或宽度。 最小宽度是设备的固定屏幕尺寸特征,当屏幕的方向发生改变时,设备的最小宽度不改变。 因此。这个值应该是应用程序布局所须要的最小的实际尺寸(通常,这个值是布局支持的最小宽度,而无论屏幕的当前方向)。
|
可用宽度 | w<N>dp 比如: w720dp w1024dp 等 |
指定最小的可用屏幕宽度,在资源中应该以dp为单位来定义<N>的值。当方向在横向和纵向之间改变时,这个配置值会跟当前的实际的宽度相匹配。 当应用程序给这个配置提供了多个不同值的资源文件夹时,系统会使用最接近(不超过)设备当前屏幕宽度的那个配置。 这个值须要考虑屏幕装饰占领的空间,因此。假设设备在显示的左边或右边有一些固定的UI元素,那么使用的宽度值就要比实际的屏幕尺寸小,由于这些固定UI元素的占用。使得应用程序的可用空间降低。 |
可用高度 | 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高分辨率屏。
比如VGA和WVGA的中等分辨率屏。 针对xlarge屏的最小布局尺寸大约是720x960dp。在大多数情况下。这样的超大屏幕的设备由于太大而要放到背包中来携带,并且最有可能的是平板样式的设备。 |
屏幕外观 | long notlong |
long:长屏幕,如WQVGA、WVGA、FWVGA notlong:非长屏幕。如QVGA、HVGA、VGA 这个限定符被加入在API级别4以后的版本号中 这个限定符全然是基于屏幕的外观比率,不相对屏幕的方向。
|
屏幕方向 | 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以后被引入。 比如,一个100px x 100px的mdpi图片的图片应该被放大成133px x 133px的tvdpi图片。 |
触屏类型 | notouch stylus finger |
notouch:非触屏设备 stylus:有适用手写笔的电阻屏设备 finger:触屏设备 touchscreen配置字段。指示到了设备上的触屏类型。 |
键盘可用性 | keysexposed keyshidden keyssoft |
keysexposed:设备有可用的键盘。假设设备启用了软键盘。那么即使在硬键盘没有暴露给用户时也可以使用这个限定符。假设没有提供软键盘或者软键盘被禁用。那么仅仅有在硬键盘被暴露给用户时才可以使用这个限定符。
|
主要文本输入法 | nokeys qwerty l2key |
nokeys:设备没实用于文本输入的硬键盘。 qwerty:设备有标准的硬键盘。无论用户是否可见; 12key:设备有12个键的硬键盘,无论用户是否可见。
|
导航键的有效性 | navexposed navhidden |
navexposed:导航键对用户可用; navhidden:导航键不可用。 假设用户可以看到导航键,那么在应用程序执行时就行改变这个限定。
|
基本的非触屏导航方法 | 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仅仅有在限定符跟平台版本号全然匹配时,才干匹配资源 |
二、Android支持的单位
1.单位
px:像素
in:英寸
mm:毫米
pt:磅(1/72)英寸
dp:与px无关的像素
dip:就是dp
sp:与刻度无关的像素,与dp类似,可依据用户字体大小的首选项缩放
2.单位换算
在标准分辨率(160dp)下:
1dp = 1dip = 1px
1pt = 160/72sp
1pt = 1/72英寸
三、指定适配特定的屏幕类型
用<compatible-screens/>指定应用程序适配的屏幕类型,没有制定的屏幕类型将会被Google Play过滤掉,即仅仅能下载指定的屏幕类型的应用。
<manifest ... >
<compatible-screens>
<!-- all small size screens -->
<screen android:screenSize="small" android:screenDensity="ldpi" />
<screen android:screenSize="small" android:screenDensity="mdpi" />
<screen android:screenSize="small" android:screenDensity="hdpi" />
<screen android:screenSize="small" android:screenDensity="xhdpi" />
<!-- all normal size screens -->
<screen android:screenSize="normal" android:screenDensity="ldpi" />
<screen android:screenSize="normal" android:screenDensity="mdpi" />
<screen android:screenSize="normal" android:screenDensity="hdpi" />
<screen android:screenSize="normal" android:screenDensity="xhdpi" />
</compatible-screens>
...
<application ... >
...
<application>
</manifest>
用<supports-screens>来指定支持的屏幕类型,这样就不必非要指定详细的屏幕类型了。用这样的方式能够指
定应用程序支持哪一种,而不是哪一个屏幕类型。(3.1-)还能够指定最小宽为多少的屏幕类型。(3.2+)
<manifest ... >
<supports-screens android:smallScreens="false"
android:normalScreens="false"
android:largeScreens="true"
android:xlargeScreens="true"
android:requiresSmallestWidthDp="600" />
...
<application ... >
...
</application>
</manifest>
requiresSmallestWidthDp 要求3.2以上(New Tools for Managing Screen Sizes.)
<supports-screens android:compatibleWidthLimitDp="320" />