5

我一直在开发移动应用程序一段时间。它可以在 iOS 和 Android 上运行,也可以作为 AIR 应用程序在桌面上运行。这很棒,我对此感到非常兴奋。然而,上周有人问我为什么不能导出在网络浏览器中运行的应用程序版本。我说我认为我可以并且我会调查它。

但是为什么要在桌面上运行移动代码呢?

有几个原因:

  • 更多的代码重用。这并非在所有情况下都有意义,但在许多情况下确实如此。(我不会详细说明,因为我认为这是不言而喻的。如果你不同意,我很乐意谈论它,但我不想用它来阻塞这个描述。)
  • 更快/更简单的客户端演示。无需在移动设备上安装 apk 或 ipa,我只需发送一个 URL。

那么我发现了什么?好吧,从我到目前为止所尝试的......它......不起作用。或者更确切地说,我无法让它发挥作用。

我首先为所有共享代码创建了一个 Flex 库项目。然后我创建了 2 个引用它的应用程序项目——一个用于移动设备,一个用于 Web。移动项目工作正常,但网络项目不能。到目前为止,这是我尝试使其工作的方法:

  • 我尝试将 mobilecomponents.swc 和 mobile.swc 主题添加到我的 Web 项目中,以便 Flash Builder 了解 MobileSkin(和其他仅限移动设备的类)。这使我的应用程序能够编译,但是当我启动它时,它会立即在 UIComponent: 内引发运行时错误VerifyError: Error #1014: Class flash.text::StageText could not be found。我对这个错误几乎没有发现,而且我发现的一个提示(添加--swf-version=13编译器选项)不起作用。
  • 我尝试使用条件编译来控制我的皮肤组件继承自哪个类:MobileSkin 或 SparkSkin。这只是一个快速实验,看看它是否有效。我知道这很恶心,而不是生产解决方案。不过我的想法是,如果 MobileSkin 真的只是 SparkSkin 的优化版本,我的皮肤应该可以继承其中任何一个。这并没有立即奏效——应用程序无法编译 b'c 某些方法丢失(例如 layoutContents),所以我放弃了它,因为一开始感觉很脏。
  • 我尝试用 UIComponent 替换 MobileSkin 作为我所有皮肤的超类,我认为 MobileSkin 可能只是 UIComponent 的轻量级子类。这种方法一开始会导致一些编译器错误(例如,没有 layoutContents 方法、没有measuredDefaultWidth/measuredDefaultHeight 属性、addChild 与 addElement 等)。一旦这些问题得到解决,应用程序就会编译,但会在 UIComponent 的“getState”方法中出现运行时错误。(看起来 MobileSkin 重写了这个方法来防止 UIComponent 的默认行为。)

所以到目前为止,这些方法都没有对我有用……但是你们呢?你遇到过这个问题吗?您是否能够使其发挥作用,或者您能发现我在上面提到的方法中所犯的任何明显的疏忽吗?如果可以的话,请提前致谢。


更新:问题已解决

我已经能够在上面提到的第一条路线上取得进展:将 mobilecomponents.swc 和 mobile.swc 主题添加到我的 web 项目中

事实证明,Flash Builder 在这方面误导了我。使用“合并到代码”设置将移动 SWC 添加到您的库项目会导致编译器警告:swc '/Applications/Adobe Flash Builder

4.6/sdks/4.6.0/frameworks/themes/Mobile/mobile.swc' 具有默认样式并且位于库路径中,这意味着将在没有样式的情况下链接依赖项。这可能会导致使用输出 swc 的应用程序缺少皮肤。swc 应该放在外部库路径中。

第一次看到这个,我将链接类型更改为“外部”,警告消失了。然后在我的 Web 项目中,我还添加了移动 SWC,并将链接类型设置为“合并到代码中”。Flash Builder 似乎对这种方法很满意,但是在运行我的应用程序时,我遇到了奇怪的运行时错误(如上所述)。

事实证明,我的第一次尝试是正确的方法。将库项目上的链接类型设置为“合并到代码中”,然后不要从您的 Web 项目重新链接。Flash Builder 会警告您,但忽略该警告。现在大部分情况下事情似乎运作良好!我有一两个问题要研究(例如,列表组件不滚动),但总体上看起来很有希望!

4

1 回答 1

3

为带有移动皮肤的网页版找到了一个简洁的解决方案

对于所有 TextInput 使用skinClass="spark.skins.mobile.TextInputSkin" 这避免了 StageText

截至目前,FlashPlayer 中缺少 StageText 仅存在于 AIR 中

于 2012-07-16T09:51:39.470 回答