Android适屏

总结一下自己的适屏经验,只希望自己不断进步,不断完善,如果有热心肠的“前辈”指导一下,不胜感激!

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,还有容易被忽视的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公司。
如果设备使用音频连接(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中是12x12、在hdpi中是18x18、在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只有在限定符跟平台版本完全匹配时,才能匹配资源




二、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" />






  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值