12

我有一款在 7 英寸平板电脑上感觉最好的游戏,在 10 英寸平板电脑和 5 英寸三星 Note 大小的设备上感觉还不错。在 Nexus 4 手机或 S3 大小的设备上,它甚至可以说是相当有趣。玩更小的东西一点也不好玩。既然如此,如何编写 Manifest 以使其可以安装在从 4.7 英寸设备到 10 英寸平板电脑的任何设备上,同时又受到小型手机的限制?

编辑

退一步说,这个问题的原因是因为我发现 Android 开发者网站上的文档令人难以置信的混乱和冲突。让我们举一些例子来说明混淆的来源:

让我们以几个不同的设备为例。

机器人 3

  • 4英寸显示屏
  • 540x960 像素
  • 275 ppi

查看 support-screens 的文档,我们可以推断出……

  • 在 4 英寸处,它可能处于“大”的边缘,但可能是中等的
  • 在 540x960 时,它完全在“大”的最小值之内
  • 在 275 ppi 它声称是 hdpi 屏幕

然而,这个设备比我想要支持的设备小得多......但文档使它看起来像 3 个计数中的 2 个,这个设备有一个“大”屏幕。没有合理的定义是 4 英寸屏幕“大”。现在,让我们更进一步……

连结 4

  • 4.7英寸显示屏
  • 768x1280 像素
  • 318ppi

查看 support-screens 的文档,我们可以推断出……

  • 这个屏幕的物理尺寸正好在中和大的边界上
  • 像素尺寸表明它可能是 xlarge
  • ppi 表明它是一个 xhdpi 设备

再一次,4.7 英寸的屏幕“xlarge”并不是一个明智的定义……屏幕的尺寸可能刚好大到足以让游戏变得有趣,但它是“中等”屏幕吗?“大”屏幕?你怎么可能知道?

以上两款手机都是“中”吗?Droid 会是“中型”而 Nexus 是“大型”吗?为什么或者为什么不?如果 Nexus 是“大”的,那么它与 7 英寸平板电脑有何不同,后者也应该是“大”?

还有一个事实是,文档声称supports-screens/size 从3.2开始就被弃用了

但是,如果一个人想要同时支持旧手机(假设适当的物理屏幕尺寸以英寸为单位)和新平板电脑,或者如果它隐藏在树林里,那么没有明确的指导来代替它使用什么。有人可以清楚地列出真正重要的标准以及为什么给定的设备会适合给定的过滤器或失败吗?

4

4 回答 4

6

我认为根据 Google 文档,这将满足您的要求(5 英寸或更小):

<compatible-screens>

    <screen android:screenSize="large" android:screenDensity="ldpi" />
    <screen android:screenSize="large" android:screenDensity="mdpi" />

    <screen android:screenSize="xlarge" android:screenDensity="ldpi" />
    <screen android:screenSize="xlarge" android:screenDensity="mdpi" />
    <screen android:screenSize="xlarge" android:screenDensity="hdpi" />
    <screen android:screenSize="xlarge" android:screenDensity="xhdpi" />

</compatible-screens>

或者使用这个(4.7 英寸或更小):

<supports-screens android:smallScreens="false"
                  android:normalScreens="true"
                  android:largeScreens="true"
                  android:xlargeScreens="true"
                  android:requiresSmallestWidthDp="536" />

我推荐第二种方法,因为它更准确。

536是怎么计算的?基于http://developer.android.com/guide/practices/screens_support.html我们有(高度 x 宽度):

  • 超大屏幕至少为 960dp x 720dp
  • 大屏幕至少为 640dp x 480dp
  • 普通屏幕至少为 470dp x 320dp
  • 小屏幕至少为 426dp x 320dp

(720 - 480) / (7 - 4) = 80, 480 + (80 * 0.7) = 536

并且不要担心“不推荐使用的警告”,因为新的建议方法适用于 UI 不是全屏的平板电脑应用程序 (IMO),并且屏幕底部和顶部的一些空间被标题栏和/或后退、菜单占用等按钮,而您的游戏可能以全屏模式运行。

从http://developer.android.com/guide/practices/screens_support.html#DeclaringTabletLayouts的 Google 文档中检查:

注意:您使用这些限定符指定的尺寸不是实际的屏幕尺寸。相反,尺寸是针对活动窗口可用的宽度或高度(以 dp 为单位). Android 系统可能会将部分屏幕用于系统 UI(例如屏幕底部的系统栏或顶部的状态栏),因此部分屏幕可能无法用于您的布局。因此,您声明的尺寸应该专门针对您的活动所需的尺寸——系统在声明它为您的布局提供多少空间时会考虑系统 UI 使用的任何空间。还要注意,尽管您的布局没有声明它,但操作栏被视为应用程序窗口空间的一部分,因此它减少了可用于布局的空间,您必须在设计中考虑到它。

于 2013-02-10T21:03:53.263 回答
3

不幸的是,没有办法根据您想要的“物理”尺寸过滤掉设备。

有两个原因。

  1. 屏幕尺寸只有四种类型:小、普通、大和超大。这太粗糙了。您需要更高的粒度:“过滤掉 LCD 小于 4.7 英寸的设备”,当前 Android 平台不支持。
  2. 屏幕大小由逻辑密度决定,逻辑密度可以设置为与物理密度相差甚远的值。例如,假设一台设备有 5 英寸屏幕,物理密度为 180 ppi。这可能是您要支持的屏幕。但是,出于某种原因,制造商决定将设备的逻辑密度设置为 320 dpi。然后,无论其物理密度如何,该设备都被归类为小屏幕设备。

供大家参考,让我向您展示从逻辑密度和屏幕像素数确定屏幕尺寸的内部逻辑。

http://androidxref.com/4.0.4/xref/frameworks/base/services/java/com/android/server/wm/WindowManagerService.java#5899

于 2013-02-14T16:33:24.820 回答
1

既然如此,如何编写 Manifest 以使其可以安装在从 4.7 英寸设备到 10 英寸平板电脑的任何设备上,同时又受到小型手机的限制?

从技术上讲,你不能。

android:requiresSmallestWidthDp最接近您想要的目标。由于这是在与密度无关的像素中测量的,并且由于与密度无关的像素应该是 1/160 英寸,因此您可以dp通过乘以 160 得出任何英寸数的值。

但是,根据您的要求,这不是指对角线。这是指最短边的宽度(例如,纵向宽度,横向高度)。

因此,如果您可以根据最小宽度重铸您的愿望,请使用android:requiresSmallestWidthDp并祈祷文档在提及 Google Play 是否尊重它时只是一团糟。当您将应用程序上传到 Play 商店开发者控制台并查看哪些设备支持它时,您将能够确定 - 找到一些您知道的设备太小(但否则应该运行您的应用程序)并查看它是否被过滤。

如果文档android:requiresSmallestWidthDp是正确的,并且 Play 商店出于过滤目的而忽略它(grrrrr ...),那么您在很大程度上被搞砸了。下一个最接近的解决方案是使用<compatible-screens>其他答案,声称您只支持largexlarge屏幕尺寸。这将淘汰您想要支持的范围低端的各种设备,但normal屏幕尺寸比您想要的要小得多(低至 3 英寸对角线)。

顺便说一句,normal对角线是 3"-5",所以 Droid 3 是normal,不是large. 像素尺寸与屏幕尺寸完全无关。

于 2013-02-11T00:27:06.533 回答
0

在实际应用中似乎没有合适的方法来做到这一点。我同意你关于 android 开发指南是多么令人困惑和矛盾的观点。不过,根据我的经验,解决此类问题的一个好办法是,当您在开发人员控制台中发布应用程序时,只需更改哪些设备可以运行您的应用程序。不过,我快速浏览了一下,在这里发现了一个类似的问题:

在 Android Market 上过滤设备屏幕尺寸

似乎是最好的方法。祝你好运!

于 2013-02-13T20:30:45.360 回答