快速预览
- 设置设备支持指定的屏幕
- 屏幕兼容模式
设置设备支持指定的屏幕
虽然理论上建议大家支持所有的屏幕设备,但这确实比较麻烦而且很容易出错。我们一般最好把手机和平板分时两大类来发布2个APK这样的效果会更好。你可以理解为我们需要针对个别
boss,换个职业来对付它,并且新职业需要熟悉设置一下
让我们的App只支持手机
因为系统通常会自动缩放来使我们的资源或者布局适应大屏幕,所以我们不需要过滤大屏幕。只要我们知道实践中应该注意哪些(上篇的内容)问题,我们的App讲在大屏幕上也能很好的显示。
但你可能发现你的App不会等比缩放的非常好,或者可能你决定只为你的App配置两个不同的屏幕适配版本。这种情况下,你可以使用<compatible-screens>
节点来组合管理屏幕的密度和大
小。外部服务比如android market就使用这样的信息来过滤你的App,仅支持你App配置的设备才会被显示出来。
<compatible-screens>
节点必须包含一个或更多的<screen>
节点,每一个<screen>
节点中指定一个屏幕配置来兼容我们的App。我们需要使用使用android:screenSize
和
android:screenDensity
这两个属性。每一个 <screen>
节点中必须包含2个属性来指定个别的屏幕配置,如果只有一个属性,那么这个节点是无效的。
例如,如果你的App兼容small和normal大小的屏幕 , 包括所有屏幕密度的话。你就必须指定8个 <screen>
节点,因为每一个屏幕大小中都有4种密度配置。你必须写出来,下面是在manifest中的实例代码:
<manifest ... > <compatible-screens> <!-- all small size screens --> <screenandroid:screenSize="small"android:screenDensity="ldpi"/> <screenandroid:screenSize="small"android:screenDensity="mdpi"/> <screenandroid:screenSize="small"android:screenDensity="hdpi"/> <screenandroid:screenSize="small"android:screenDensity="xhdpi"/> <!-- all normal size screens --> <screenandroid:screenSize="normal"android:screenDensity="ldpi"/> <screenandroid:screenSize="normal"android:screenDensity="mdpi"/> <screenandroid:screenSize="normal"android:screenDensity="hdpi"/> <screenandroid:screenSize="normal"android:screenDensity="xhdpi"/> </compatible-screens> ... <application ... > ... <application> </manifest>
让我们的App只支持平板
如果让我们App支持平板的话,我们可以完全放弃small屏幕的支持和优化。并在<supports-screens>
节点中阻止小屏幕的设备在market上下载我们的App
实例代码如下:
<manifest ... > <supports-screens android:smallScreens="false" android:normalScreens="false" android:largeScreens="true" android:xlargeScreens="true" android:requiresSmallestWidthDp="600"/> ... <application ... > ... </application> </manifest>
需要同时使用两种方法描述关于屏幕大小的支持:
- 声明App不支持small 和normal的屏幕大小。
- 声明App需求一个最小化可用的屏幕宽度至少为600dp。
第一种方法执行与android3.1或者更老的版本,因为这些设备是基于四种传统的屏幕大小后缀。而第二种方法requiresSmallestWidthDp
属性是为支持android3.2和更高的版本,因为这是新版本的特性。
为了支持requiresSmallestWidthDp
你可能需要在android 3.2或者更高的android版本中编译它们。但在老版本中是没有这个属性的,它们会在编译时报错。所以我们新建工程的时候要选择
android3.2,并在manifest中使用minSdkVersion指定最小的SDK版本。这样的话,android比3.2还老的版本会忽略那个属性,所以就不会有运行时失败的风险。
警告: 如果使用 <supports-screens>
节点并设置large 屏幕的属性为false的话,那android market不会过滤large屏幕哦。你的App仍然可以被large屏幕的设备安装,但执行时他不会适应
屏幕。系统会模拟手机屏幕来显示。如果你想要阻止app被large屏幕的设备下载。请使用上面关于手机的<compatible-screens>
节点。所以我们最好结合<compatible-screens>和
<supports-
screens>。
根据不同的屏幕发布多个apk
虽然理论上建议只发布一个Apk,但在android market上徐云发布多个功能一摸一样的Apk,只为了指定不同的屏幕。例如,如果你想要发布手机和平板两2个版本,这样你应该发布两2个Apk让用户选择。但使用一个Apk还是可以达到同样的功能的。
屏幕兼容模式
注意: 如果你已经开发了一个android3.0版的App,但它可能会为更大的屏幕(例如平板)调整布局,为了最好的用户体验,你应该关闭兼容模式。这一节就是我们需要的讲的内容
屏幕兼容模式是不能在大屏幕上适当调整的。在android1.6开始,就已经支持各种各样的屏幕大小并会自动调整App的布局以让它们适应每一个屏幕。但是你的App如果没有顺利的参考上一
篇的内容,那么在大屏幕上它可能会偶尔遇到显示问题。为了解决这个问题,屏幕兼容模式会让你的App能有多一点的机会用在大屏幕上。
有两种屏幕兼容模式,它们稍微有些不同:
-
版本1 (Android 1.6 - 3.1)
-
系统绘制App的UI就想在邮票窗口里绘制那样。系统绘制App的布局会使用黑边填充屏幕剩余的区域。
在1.6就引入了屏幕兼容模式这个概念,并且那时候仅为320dp*480dp的原始屏幕而设计(非常关键的一点,你有没有发现平板的密度都是mdpi的)。因为有一些老旧的设备执行于android1.5上,并且这个版本可能在将来的不久被废弃掉
关闭屏幕的兼容模式,你只要简单的设置
android:minSdkVersion
或android:targetSdkVersion
为4或者更高,还或者设置android:resizeable
="true"就OK了。
版本2 (Android 3.2 或更高)
-
系统绘制App的UI会基于默认的尺寸(320dp*480dp)填满屏幕。本质上就像一个"zoom"会放大你的布局,这通常会使你的某些控件模糊。
引入版本2的模式是为了在android3.2或者更高的平板上,帮助你的App即使没有实现上篇讲的内容也能能平板上运行。
大体上,执行于android3.2或更高版本的大屏幕设备允许用户打开屏幕兼容模式,当App没有在manifest 中明确的声明它支持大屏幕时。在这种情况下,一个图标会出现在系统栏的时钟旁边,用户可以选择屏幕兼容模式开或者关(如图3)。如果一个App明确的声明它不支持大屏幕,那么屏幕兼容模式会一直打开,用户不能关闭它
作为一个开发者,当App使用屏幕兼容模式时我们有控制权。对于运行在android3.2或以上的大屏幕设备,下面的内容会教我们怎么关闭或者打开屏幕兼容模式,选择权在于你。
关闭屏幕兼容模式
如果你的APP的目标主要是低于android3.0的,但为了防止有可能我们的App会运行到平板上,我们应该关闭它。因为用户打开兼容模式后效果可能不太理想。
默认的, 在android3.2或更高版本上屏幕兼容模式会提供给用户一个选择。只要满足以下的其中一个条件
- 你的App设置
android:minSdkVersion
andandroid:targetSdkVersion
为"10"
或者更小的数字(要参考api level),并且没有明显的声明它支持大屏幕(<supports-screens>
节点中不要声明它) - 你的App设置
android:minSdkVersion
andandroid:targetSdkVersion
为"11"
或者更高的数字(要参考api level) 并且在<supports-screens>节点中
声明了它,但值为false(例如android:largeScreens="false")
完全的关闭屏幕兼容模式的用户选项并移除那个图标,我们可以按照下面的方法做:
- 最简单的:
在manifest 中,添加
<supports-screens>
节点并指定android:xlargeScreens
为true<supports-screens android:xlargeScreens="true"/>
它声明了你的App支持所有的大屏幕,系统就会一直调整布局来适配屏幕。它忽略
<uses-sdk>
属性。 - 简单并还有其他的效果:
在 manifest'
<uses-sdk>
节点下, 设置android:targetSdkVersion
为"11"或更高:<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="11"/>
就是说你的App支持android3.0并也可以为大屏幕的设备工作。
如果屏幕兼容模式在你改变了上面的设置后还是打开的,那么你就需要检查manifest中的
<supports-screens>
节点了,确定它没有设置为false。
打开屏幕兼容模式
当我们的App目标位android 3.2或更高时,我们能使用<supports-screens>
节点来设置某些屏幕开打它的兼容模式。
- 在manifest 中, 添加
<supports-screens>
节点并指定android:compatibleWidthLimitDp
为“320”<supports-screensandroid:compatibleWidthLimitDp="320"/>
这表明,最大的“最小屏幕宽度”为你的应用程序设计320dp。这样一来,只要有一个设备的其中某一个比较小的边只要大于320dp就将提供屏幕兼容模式,并为用户可选功能。注意: 当前屏幕兼容模式只模拟320dp的宽度,如果你的
android:compatibleWidthLimitDp
大于320,它就不适应其他设备了。 - 如果你想强制用户使用兼容模式,那么你就可以使用
android:largestWidthLimitDp
值。<supports-screensandroid:largestWidthLimitDp="320"/>
看起来好像都是打开兼容模式,但区别在于largestWidthLimitDp是不允许用不关闭的,compatibleWidthLimitDp可以允许用户关闭