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

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公司。

假设设备使用音频连接(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" />

Android适屏的更多相关文章

  1. 【读书笔记《Android游戏编程之从零开始》】17.游戏开发基础(游戏适屏的简述和作用、让游戏主角动起来)

    1.游戏适屏的简述和作用 由于市面上安装 Android 系统的手机不断增多,出现了各种分辨率.各种屏幕尺寸的Android 系统手机.为了保证一个游戏或者一个软件能在所有的 Android 手机上正 ...

  2. Android横竖屏切换及其对应布局加载问题

    第一,横竖屏切换连带横竖屏布局问题: 如果要让软件在横竖屏之间切换,由于横竖屏的高宽会发生转换,有可能会要求不同的布局. 可以通过以下两种方法来切换布局: 1)在res目录下建立layout-land ...

  3. Android 全屏显示

    Android全屏显示: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInst ...

  4. Android横竖屏切换小结

    Android横竖屏切换小结 (老样子,图片啥的详细文档,可以下载后观看 http://files.cnblogs.com/franksunny/635350788930000000.pdf) And ...

  5. 【转】Android横竖屏切换问题

    Android横竖屏切换总结(Android资料) Android横竖屏要解决的问题应该就两个: 一.布局问题 二.重新载入问题 1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的 ...

  6. Android横竖屏切换及其相应布局载入问题

    第一.横竖屏切换连带载入多屏布局问题: 假设要让软件在横竖屏之间切换.因为横竖屏的高宽会发生转换,有可能会要求不同的布局. 能够通过下面两种方法来切换布局: 1)在res文件夹下建立layout-la ...

  7. Android横竖屏切换处理

    Android横竖屏要解决的问题应该就两个: 1.布局问题:2.重新载入问题   一.布局问题: 如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的AndroidManifest.xml中找到你 ...

  8. Android横竖屏切换总结

    Android横竖屏切换总结(Android资料) Android横竖屏要解决的问题应该就两个: 一.布局问题 二.重新载入问题 1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的 ...

  9. android MIPI屏 导航栏丢失

    /**************************************************************************** * android MIPI屏 导航栏丢失 ...

随机推荐

  1. 二重积分的计算 —— 交换积分顺序(exchange the order of integration)

    交换积分顺序的诀窍在数形结合: 1. 几句顺口溜 后积先定限,限内穿条线,先交下限写,后交上限见 先积 x,画横线(平行于 x 轴),右减左: 先积 y,画竖线(平行于 y 轴),上减下: 2. 简单 ...

  2. 爬虫—分析Ajax爬取今日头条图片

    以今日头条为例分析Ajax请求抓取网页数据.本次抓取今日头条的街拍关键字对应的图片,并保存到本地 一,分析 打开今日头条主页,在搜索框中输入街拍二字,打开开发者工具,发现浏览器显示的数据不在其源码里面 ...

  3. Codeforces Round #198 (Div. 2)A,B题解

    Codeforces Round #198 (Div. 2) 昨天看到奋斗群的群赛,好奇的去做了一下, 大概花了3个小时Ak,我大概可以退役了吧 那下面来稍微总结一下 A. The Wall Iahu ...

  4. 如何在C#中运行数学表达式字符串

    方法1:利用DataTable中的Compute方法 1 string expression = "1+2*3"; 2 DataTable eval = new DataTable ...

  5. 云信 短信发送 demo

    package com.dataTaskListener; import org.apache.commons.httpclient.Header; import org.apache.commons ...

  6. (转载) popupWindow 指定位置上的显示

    popupWindow 指定位置上的显示 标签: androidpopupWindowpopupWindow具体位置放置 2014-07-09 16:23 1114人阅读 评论(0) 收藏 举报  分 ...

  7. 关于生sql中的空值

    在数据库中的空值无非就是两种形式的表示 一种是什么都没有,一种是以NuLL显示的 , 那么在C# 读取出来怎么判断呢, DtStatus.Rows[0]["FetchCode"]. ...

  8. 使用Eric构建Caffe应用程序-Baby年龄识别

    训练好的Caffe网络结构,可以固定下来,直接载入程序作为数据库接口使用.本文使用Eric构建运行于Python环境下的图片识别应用程序,因为Eric使用QT作为GUI,且有Python的接口,可直接 ...

  9. layui 多选下拉框 控件 样式改变原因

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. chrome中自动回填表单解决

    input添加属性autocomplete="new-password"