iPhone在闪存中的不同屏幕尺寸? (获取黑条)
Posted
技术标签:
【中文标题】iPhone在闪存中的不同屏幕尺寸? (获取黑条)【英文标题】:iPhone different screen sizes in flash? (Getting Black Bars) 【发布时间】:2016-06-27 22:52:10 【问题描述】:我是整个编码世界的新手,actionscript 3 是我的第一次真实体验,如果我没有立即理解您的答案,非常抱歉。
我在 AIR for ios 中使用 Adobe Flash CC 构建了一个 iPhone 应用程序。所有代码要么在时间线中,要么在单独的 .as 文件中(因此不使用文档类)。
游戏的核心概念是随机生成的物体从屏幕顶部落下,用户必须点击它们才能让它们在触到底部之前消失。
我的问题是我的文档大小是640 x 960
。我认为这适合 iPhone 4(还没有测试过),但是当我在 iPhone 5s 上测试它时,我会在顶部和底部得到回条。显然它们具有不同的屏幕尺寸,但我希望该应用程序能够在许多不同尺寸的 iPhone 上运行。
我花了几个小时在谷歌上搜索,但仍然不明白我的意思。我尝试过使用stage.scaleMode
设置,但没有任何变化。我还在包含的文件中添加了一个名为 default-568h@2x.png
的文件(只是一个尺寸为 640 x 1136
的绿色矩形),但这也没有显示。
所以本质上我想知道如何更改我的应用和 AS3 代码以使我的应用适合所有不同尺寸的 iPhone?
任何帮助将不胜感激。
【问题讨论】:
上次我在 Flash 中玩弄 iOS 发布(CS 4?)时,它表现得好像文档边界更多的是建议而不是绝对:文档区域之外的空间(通常在 Flash 中表示为灰色区域)将在文档背景颜色中部分可见。该区域中的任何影片剪辑也将是可见的,就像您在浏览器中打开一个 swf 而不将其嵌入到 html 页面中一样。 我也听说过这个,但我尝试扩展我的背景并将几个 MovieClips 放在文档边界之外,但它在我的 iPhone 上仍然是黑条。 我会尝试让文档匹配更大的屏幕,看看在这种情况下会发生什么。如果这不起作用,那么你手头上的问题就很严重了。 也许我应该将文档大小更改为最大的 iPhone(iPhone 6 plus),然后看看会发生什么。我可以将属性更改为 stagewidth 等而不是 x。我看看会发生什么 这就是为什么我认为编程是一门与神秘相接的不精确科学。有时,您只需要反复试验和试验,直到某些东西起作用,或者它使您的计算机着火。 【参考方案1】:启动图像
首先,首先,您需要确保项目中包含正确的启动图像。
这是来自Adobe's website的表格:
默认~iphone.png | iPhone 4(非视网膜)640 x 960 肖像 默认@2x~iphone.png | iPhone 4、4s 640 x 960 肖像 默认-568h@2x~iphone.png | iPhone 5、5c、5s 640 x 1136 肖像 默认-375w-667h@2x~iphone.png | iPhone 6/7/8 750 x 1334 肖像 Default-414w-736h@3x~iphone.png | iPhone 6+/7+/8+ 1242 x 2208 肖像 Default-Landscape-414w-736h@3x~iphone.png | iPhone 6+/7+/8+ 2208 x 1242 横向 Default-Landscape-812h@3x~iphone.png | iPhone X 2436 x 1125 横向 默认-812h@3x~iphone.png | iPhone X 1125 x 2436 纵向一旦您制作了这些图像(并完全按照所示命名),请将它们包含在您的项目中(它们必须位于应用程序的 root 中),方法是以下:
在 FlashPro 中
转到您的发布设置 转到 AIR for iOS 设置。 转到“常规”标签 将所有这些图像添加到“包含文件”列表(根目录)扩展您的内容
选项 1,填充和裁剪如果您不介意稍微裁剪您的内容,您可以在应用启动时执行此操作:
stage.scaleMode = StageScaleMode.NO_BORDER
这将缩放您的 swf,使其充满整个屏幕,同时保持纵横比。很容易计算出您需要多少填充才能使此方法适用于各种 iPhone 的纵横比的微小变化。
但是,如果您想允许方向更改(纵向到横向),裁剪可能会过于严重。
选项 2 - 响应式设计不过,适应不同屏幕分辨率和纵横比的最佳方法是让您的应用程序响应。这涉及到应用程序开头的以下代码:
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
现在您的舞台边界(stage.stageWidth
和stage.stageHeight
)将是设备的全宽和全高*。 (有些设备的底部或顶部仍有软件工具栏)
然后您可以通过代码定位事物。
如果您想要一种简单的方法来转换您拥有的内容(您不想使用代码来调整大小和完全对齐所有内容),只需将所有内容放入实例名称为 container
的容器 MovieClip 中,您可以然后像这样调整大小和位置:
//scale the container as big as possible while still fitting entirely in the screen:
//figure out which dimension should match the stage (widht or height)
if(container.width - stage.stageWidth >= container.height - stage.stageHeight)
container.width = stage.stageWidth;
container.scaleY = container.scaleX;
else
container.height = stage.stageHeight
container.scaleX = container.scaleY;
//center it on the screen:
container.x = (stage.stageWidth - container.width) * 0.5;
container.y = (stage.stageHeight - container.height) * 0.5;
监听调整大小事件也是一个好主意,以防屏幕尺寸发生变化(例如,您在桌面上最大化/恢复,或者在移动设备上从纵向变为横向)。
您可以通过监听舞台上的 resize 事件来做到这一点:
stage.addEventListener(Event.RESIZE, redrawScreen);
function redrawScreen(e:Event):void
//resize everything as the window size has changed.
【讨论】:
谢谢。我刚刚尝试了 stage.scaleMode = StageScaleMode.NO_BORDER 但没有任何改变?我还有黑条吗? 哪里有代码?如果使用时间轴,它应该位于根时间轴的第一帧。此外,您需要部署到 AIR 3.5 或更高版本。 我在一个名为“动作”的层中有代码,它位于时间轴的第一帧中。该框架仅包含少量代码。无论我放什么缩放模式,当我将它发布到我的 iPhone 上时,都没有任何变化。我没有收到错误消息,但似乎没有效果。我正在运行 AIR 17.0。 您是否正在导入您所引用的类?import flash.display.StageScaleMode;
应该给你一个错误,但如果这是问题所在。希望我有一个方便测试的 ios 设备,我已经有几年没有做过任何 iOS 工作了。它可以在桌面上运行吗?
是的,我正在导入它。在桌面上它似乎可以工作,当我调整它的大小时,它会调整其余部分的大小(有点裁剪)。什么都没有发生,当我把它放在 iPhone 上时只是黑条。【参考方案2】:
编码员负责为不同的屏幕尺寸提供不同的解决方案。您检查设备大小,然后相应地呈现内容。总而言之,这与基于旋转显示不同的内容没有什么不同。如果您希望有一个神奇的解决方案可以在 AIR 中为您完成所有这些工作,那么您就不走运了,因为没有。
不建议使用舞台缩放模式(您应该始终在移动设备上不使用缩放),因为这样您就完全放弃了根据实际物理设备尺寸比较显示对象位置的能力(基本上您不会知道确定您显示的内容是在屏幕上还是完全不在屏幕上)。
如果您认为移动开发很容易(不仅使用 AIR,还使用任何技术),那么抱歉,您必须处理所有这些大小,这并不是特别重要。
如何处理的基本原则:
-
获取实际设备尺寸。
计算真实密度/比率。
将该大小与您的应用程序的大小进行比较。 (再次缩放模式到无缩放)
提取一般比率(应用大小与设备大小的比较)
使用该比率来缩放和放置您的主容器(一个包含整个应用的容器),硬:在您的应用中缩放和放置所有 DisplayObject。
由于应用比率保持不变,因此请在空白处填充任何内容。
您的应用在任何设备上都能正确填满整个屏幕。
【讨论】:
以上是关于iPhone在闪存中的不同屏幕尺寸? (获取黑条)的主要内容,如果未能解决你的问题,请参考以下文章
在 Xcode 中将图像尺寸调整为不同的 iPhone 屏幕尺寸