本指南概述了 Corona 中的**虚拟像素**,并解释了如何使用**自适应**缩放使其行为类似于原生 iOS/Android 虚拟像素。
Corona 提供了自己的虚拟像素方案,称为**内容缩放**。这允许开发者指定一组通用的屏幕坐标,而 Corona 会根据设备自动缩放文本、矢量对象和图像到不同的分辨率。
实际上,有多种方法可以实现内容缩放。最简单的方法是选择一个单一的
以虚拟像素定义内容区域的**宽度**和**高度**
指定一个**缩放**模式,例如 "letterbox"
或 "zoomEven"
—— 这决定了 Corona 如何填充屏幕。
如果使用 "letterbox"
模式,请针对虚拟屏幕和实际设备的纵横比不同时出现的空白信箱区域进行设计 —— 这些区域类似于电视节目以信箱模式显示时的黑条,不同之处在于,在 Corona 中,这些区域可以(并且**应该**)绘制视觉内容。或者,如果使用 "zoomEven"
模式,请理解当纵横比不同时,某些视觉内容可能会从屏幕上溢出。
实际上,一个简单的 config.lua
文件可能包含如下值:
application = { content = { width = 320, height = 480, scale = "letterbox", } }
在本指南中,此方法将被称为**简单内容缩放**,之所以这样命名,是因为
有关内容缩放及其配置方式的更多详细信息,请参阅项目配置指南。
虽然简单内容缩放在大多数情况下都能很好地工作,但它并非万能的。在某些应用程序中,尤其是
如果应用程序设计锁定到特定的纵横比,则管理信箱区域或允许溢出并不理想。在这种情况下,如果整个**虚拟**屏幕与**设备**屏幕具有相同的纵横比会更好。
与手机相比,平板电脑上的按钮和其他 控件 等界面元素按比例放大 —— 换句话说,在手机上看起来合理(大小)的 UI 元素通常在平板电脑屏幕上显得异常大。
鉴于简单内容缩放的各种缺点,尤其是在
要设置自适应内容缩放,只需将 config.lua
中的 scale
键设置为 "adaptive"
即可。
application = { content = { scale = "adaptive", } }
由于自适应缩放会按照下一节所述计算内容区域大小,因此在使用 "adaptive"
缩放模式时**无需**定义 width
和 height
值。
对于自适应缩放,Corona 使用启发式方法来确定适当的内容宽度和高度。主要目标有三个:
虚拟屏幕的纵横比应与实际设备屏幕匹配,这意味着没有信箱区域。
首选像素缩放比例应尽可能为整数(或**简单分数**)。
虚拟像素密度在不同设备上应大致相同。
对于 iOS,这是通过将内容宽度和高度设置为与设备以 iOS 点为单位的宽度和高度相匹配来实现的。这很有效,因为 iOS 点的物理尺寸大致相同。
对于 Android,内容宽度和高度设置为匹配**dp**hdpi
、xhdpi
等)
只要允许虚拟屏幕大小更改,就会存在权衡,并且复杂性会略有增加。具体来说,代码应该知道内容宽度和高度可以根据设备而变化。因此,与其对某些界面元素使用静态宽度和高度值,不如通过 display.contentWidth
、display.contentHeight
以及围绕这些属性的各种计算**动态**定义这些值,例如display.contentWidth * 0.5
display.contentHeight
,将其垂直中心点定位在屏幕底部。
简单内容缩放和自适应内容缩放之间的区别本质上在于:
在简单缩放场景中,内容的**视觉大小**会被缩放。因此,在更大的屏幕上,对象实际上会以标尺长度(例如英寸或厘米)变得更大。
在自适应缩放场景中,内容的视觉大小在不同屏幕尺寸上大致相等,这意味着更大设备上有更多可用屏幕空间。
理解差异的另一种方法是检查像素缩放比例会发生什么变化。使用简单内容缩放,像素缩放比例在不同设备上有所不同,但在自适应缩放中保持不变。考虑以下比较:
在简单缩放场景中,假设内容宽度设置为 320
。在屏幕分辨率宽度为 750 的 iPhone 7 上,像素缩放比例约为750/320
)750 / 320 = ~2.34
,这意味着一个虚拟像素对应约 2.3 个实际像素。在更大的 iPhone 7 Plus 上,屏幕分辨率宽度为 1242,像素缩放比例变为约1242/320
)
1242 / 320 = ~3.88
。
自适应缩放还会影响 Retina/HD 图像选择的缩放阈值的选择
在简单缩放场景中,可能需要高达@4x
后缀的@2x
和@3x
后缀的
在为 config.lua
的 imageSuffix
表选择实际阈值时,@2x
和@3x
后缀的@3x
图像的缩放阈值分别为 2.0
和 3.0
似乎是合乎逻辑的,如:
application = { content = { scale = "adaptive", imageSuffix = { ["@2x"] = 2.0, ["@3x"] = 3.0, }, } }
但是,有两个特定原因导致阈值应该降低:
在 Android 上,hdpi
设备的分数比例为 1.5 倍。在这种情况下,应通过将关联阈值降低到 1.5
来选择 @2x
图像。
iPhone 7 Plus 是一款像素缩放比例有点奇怪的设备。在这里,@3x
图像,否则将选择 @2x
图像并放大,这可能看起来不太理想。这可以通过将关联阈值降低到 2.5
来实现。
考虑到这些因素,**自适应** config.lua
应包含如下阈值:
application = { content = { scale = "adaptive", imageSuffix = { ["@2x"] = 1.5, ["@3x"] = 2.5, }, } }