多个屏幕分辨率/纵横比(游戏)

44

编辑: 感谢所有回答和评论。 经过思考,我想重新表达问题的核心:如何确定并限制我的游戏能够运行的最小分辨率/比例。因为在我看来,游戏在最小的屏幕/比例上变得无法玩(缺乏细节),或者支持甚至最小的屏幕/比例会显著降低其他玩家的体验。此外,我们甚至不知道最小的分辨率是多少,也无法以其他方式限制它,除了禁用 ldpi...但这仍然不能告诉我们最小的 mdpi。毕竟,我不是在考虑如何创造一个好结果,而是在考虑如何创造一个完美的结果;)。我猜这还不可能(现在)。

注意: 这只涉及手机而非平板电脑。 此外,这个问题对于不使用Android布局系统的游戏而言并不那么相关。

我始终觉得有关预期分辨率的定义有些模糊。 我知道文档中有列表

现在我的第一个问题是,这个列表是否完整,换句话说,制造商是否允许使用其他分辨率或纵横比。 我的目前方法是将此列表视为纵横比,大致如下(不确定是否准确,但您可以理解):

  • ldpi:最小纵横比4:3
  • mdpi:最小纵横比3:2
  • hdpi:最大纵横比16:9

4:3 3:2 16:9

因此,如果我想涵盖一系列设备,我会确定我的最小和最大纵横比,并为最小的设计布局,同时使它自动增长到最大。

例如,如果我想要支持所有的屏幕密度,我会按照4:3的比例设计屏幕,并将其扩展到16:9。如果我删除了低密度(ldpi)的支持,那么我会按照3:2的比例进行设计。
当然,这是基于假设,即不会出现长宽比为4:3的中等像素密度(mdpi)设备,这也带回了我的第一个问题。
我倾向于在 Android 市场上标明我的应用程序可以处理哪些长宽比,但目前似乎不可能实现。
有没有更好的方法呢?(请记住,这是专门针对手机游戏的)

那么屏幕比例会如何影响布局呢?它仅仅是图片和组件的大小,还是你会为更宽的手机和更短的手机设计完全不同的布局? - Phil
明白了。我在想,如果你是用Android Java实现这个功能,那么你可以简单地获取屏幕比例,并根据该比例缩放所有图像或对象。 - Phil
我明白了。我只是想确保我没有误解这行代码,而且你对Java感兴趣 - 这个误解是为什么还没有人回答的原因。 - Phil
实际上它是用Java实现的(libgdx - http://libgdx.badlogicgames.com/) - mibollma
1
也对此感兴趣,从游戏开发的角度来看。这不仅仅是调整布局的问题,因为我们有多个层,其中一些是固定的(即重叠的HUD图像,水平拉伸会看起来很糟),而一些自然可以处理宽高比变化(例如,一个只是查看更大场景的层:改变宽高比只会改变视口的大小,并允许观察更多或更少的场景)。 - MrCranky
显示剩余2条评论
6个回答

19

我不能直接回答你的问题,但我想告诉你我的方法。我尽量不使用任何数字,而是尝试使用填充、边距和相对布局,使我的视图在任何手机上看起来都正确。这也帮助我避免为不同方向创建视图。


+1 - 这是正确的方式。例如,游戏中的HUD和屏幕控件可以相对于屏幕边缘放置。 - pqn
这种方法只有一个问题。如果您想要最大化可用的屏幕空间怎么办?比如说,您有一个固定大小的2D游戏场地,它不会滚动、缩放或根据手机增加/减少级别大小...例如俄罗斯方块或吃豆人。您如何确定您的最小/最大值? - mibollma
我根本不确定它们。我将高度和宽度设置为fill_parent,就这样。 - superM
这是一种方法。但实际上,您有许多选项来处理多个屏幕尺寸。我写了一篇文章,可能会对您有所帮助:http://alexis.pautrot.com/dealing-with-different-screen-sizes/ - Alexis Pautrot

4
正如其他人在这里提到的,我的方法也是充分利用设备无关组件,例如填充、边距和相对布局,结合设备无关像素使用。
说实话,我希望不只有我这样做,但是充分利用DIP(设备无关像素)和相对布局等技术,已经将我的活动布局文件减少到每个活动只需要一个,而不是针对HDPI、MDPI和LDPI各种不同的布局文件。
如果您真的关心纵横比,您可以随时调用设备的像素显示属性,并根据这些数字进行适当的布局计算。您可以在第一个活动的onCreate方法的最开始调用此方法。 Display display = getWindowManager().getDefaultDisplay(); int displayWidth = display.getWidth(); int displayHeight = display.getHeight(); 这将为您提供硬件显示器的宽度和高度值(以像素为单位)。在我看来,选择超过3种布局类型的真正原因是确保图像分辨率足够清晰。
通过这些数字,您可以进行一些内部逻辑,计算在某些小部件中加载哪种类型的分辨率图像。从而节省了制作3倍相同布局的麻烦...
可能解释得有点神秘,但克服各种设备分辨率的主要方法是大量使用:
- 相对布局 - 设备无关像素
您还可以在XML布局中定义DIP,以便每个组件在每种类型的设备上看起来都一样。
这可能是一个愚蠢的例子,但是嘿,它对我有效。 以下是我尝试使TextView上的文本大小在所有设备上相对相同的代码示例。您可以调用“TypedValue”类,并从其中提供的许多公共变量中进行选择。由于我想使TextView在任何地方的大小相对相同,因此我使用了下面的代码:
someTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18);

该数字用于设置DIP尺寸的大小。

TypedValue可用于许多小部件或活动组件,这些组件需要INT值来进行尺寸属性的设置。尝试使用它,你会发现它可以使生活变得更加轻松 :-p

希望这个答案能够有所帮助。


1
你的方法对于应用程序来说很好,但对于大多数游戏来说并不适用。然而,由于答案和评论,我会重新表述问题的核心:“如何确定和限制我的游戏能够运行的最小屏幕尺寸”。因为在我看来,游戏在最小屏幕上变得无法玩(缺乏细节),或者甚至支持最小屏幕也会显著降低其他所有人的体验。此外,我们甚至不知道最小分辨率是多少,也不能以任何方式限制它,除了禁用ldpi...这仍然不能告诉我们关于最小mdpi的信息。 - mibollma
那么,我想这就是人生中做出选择的全部... OP:如果我是你,我会简单地开发我的游戏,只允许在MDPI、HDPI和XDPI范围内的设备(大型平板电脑)使用,并且放弃小尺寸设备... 这肯定会让你摆脱头痛。而且,让我们诚实点,像SonyEricsson Xperia 10 mini这样的小设备不可能像Game boy DS一样拥有同样的处理能力... - Hugo Sepulveda
目前我所做的是,但一旦制造商使用4:3的宽高比创建mdpi或hdpi设备,我将从这些用户那里得到1星评价。目前它适用于所有手机,但如果它可能随时出现问题,那么它并不是我认为的高质量。我认为创建这些组(ldpi、mdpi等)本来就是愚蠢的,至少对于游戏来说是这样。 - mibollma
对于文本大小,我认为必须使用 sp 而不是 dp? - letroll

4
我找到了一个明确的解决方案。
在3.0之前,最小分辨率未定义。因此,在3.0及以上版本中,可以选择最小分辨率,设计基于它的游戏,并在更大的屏幕/比例上动态增长布局,如superM和其他人所提到的。
当您为不同的屏幕大小设计UI时,您会发现每个设计都需要一定的空间。因此,上面的每个通用屏幕大小都有一个与之关联的最小分辨率,由系统定义。这些最小尺寸以“dp”单位表示 - 您在定义布局时应该使用相同的单位 - 这使系统避免担心屏幕密度的变化。
  • 大屏幕至少为640dp x 480dp
  • 正常屏幕至少为470dp x 320dp
  • 小屏幕至少为426dp x 320dp
注意:这些最小屏幕尺寸在Android 3.0之前没有很好地定义,因此您可能会遇到一些被错误分类为正常和大型的设备。这些也基于屏幕的物理分辨率,因此可能因设备而异 - 例如,具有系统栏的1024x720平板电脑实际上可用空间比它被系统栏使用的空间少一点。

来源


实际上,处理这些情况有许多方法。您可以应用许多不同的选项来处理所有不同的长宽比,并选择正确的纹理分辨率来处理您的资源。我已经写了一篇文章,可以帮助您:http://alexis.pautrot.com/dealing-with-different-screen-sizes/ - Alexis Pautrot
Alexis的链接已失效。 - David

3

没有一份详尽的宽高比列表。制造商可以决定任何他们想要的分辨率。此外,宽高比与像素密度不匹配,因此使用ldpi / mdpi / hdpi来决定宽高比可能不是一个好主意。

处理这个问题的策略取决于你的游戏。当然,在某种程度上,你应该只是简单地将所有内容放大/缩小,但显然棘手的部分是在不同宽高比上不同的边缘。某些游戏(第一人称射击游戏、横向卷轴游戏、平铺式俯视角游戏等)你可以提供不同的视野而不会有太多问题,只要你不担心给某些设备带来优势,对于其他游戏,你可能需要考虑为背景提供可伸缩或可平铺的图形,并保持相同的有效(缩放后)游戏区域。


此外,纵横比与像素密度不匹配,因此使用 ldpi/mdpi/hdpi 来决定纵横比可能不是一个好主意。您的意思是什么? - mibollma
也就是说,我的方法基于从列表中获取分辨率并确定它们的纵横比,这导致“假设”只有低密度(ldpi)使用4:3。目前这个方法表现良好,但是一旦有人发布了一个4:3中等密度(mdpi),我就会束手无策,甚至不能在市场上“事先”指出它不兼容。缩放是不可能的,因为我不想因为少数人的体验而破坏许多人的体验,目前我的方法覆盖了大约99%的所有手机。 - mibollma
大致上就是你所说的。根据比例匹配像素密度只是一种宽泛适用的假设。例如,我认为Nexus One和Motorola Droid都是hdpi,但Nexus是800x480而Droid是854x480。很明显,它们的屏幕长宽比不同。 - kabuko
800x480 是 15:9,而 854x480 是 16:9。然而,只要您知道您的最小/最大比率是什么,这不是什么大问题。如果您支持从 3:2 到 16:9 的所有内容,那么 15:9 就会自动包括在内,因为它只是介于两者之间,并且仅在宽度上有所不同,而在高度上则没有差别。 - mibollma

2

0

你可以基于屏幕分辨率限制市场上哪些设备可以看到你的游戏: http://developer.android.com/guide/appendix/market-filters.html

我没有完全深入研究,但遗憾的是我没有看到提到长宽比的内容,因此您可能需要填写所有您知道有效的分辨率。

如果以上方法不适用,您可以设置所需的最小分辨率以使图形看起来更好,如果不想为较小的长宽比更改游戏,则可以添加黑色边框,就像控制台游戏一样。然而,这并不推荐,移动屏幕空间已经很宝贵了,因此如果您使用黑条切割播放区域,建议将HUD移动到黑色区域中,以便尽可能多地使用屏幕。

有关支持屏幕尺寸的更多信息,请参见此处: http://developer.android.com/guide/practices/screens_support.html

:D


我刚刚找到了答案。但是看起来你错了。在3.0版本之前,最小分辨率未定义,并且我没有看到任何基于分辨率限制的工具。 - mibollma
如果我的话让你产生了误解,对此我深感抱歉,因为我并没有在市场上提交任何东西。正如你所说,在3.0之后,你可以基于一般尺寸而不是特定分辨率来进行限制。虽然它似乎指引你朝着正确的方向前进,但愿你在游戏的其余部分能够顺利进行。 - Danny Parker
不幸的是,自从3.0成为仅限平板电脑使用的系统后,它并没有太多变化,并且可能要等到4.0才会与Android手机版本合并。 - mibollma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接