【问题标题】:Scaling issue with mobile flex app移动 flex 应用程序的缩放问题
【发布时间】:2013-01-17 14:40:13
【问题描述】:

我有几个 AS3 游戏想在 flex 移动应用程序中运行。我将我的原始游戏放入一个库中,然后将其添加到我的移动应用程序中。到目前为止一切顺利。

我遇到的问题是,当游戏开始时,它不会自行缩放到我在游戏中指定的 StageScaleMode.SHOW_ALL。

我是这样开始游戏的:

var game:MyGame = new MyGame();
var container:UIComponent = new UIComponent();
addElement(container);
container.addChild(game);               
this.actionBarVisible = false;

我尝试在我的 mxml 中为舞台设置相同的比例选项,但它没有改变任何东西。

有什么想法吗?

谢谢。

【问题讨论】:

  • 分享设置 StageScaleMode 的代码可能会有所帮助。它在 MyGame 的构造函数中吗?或者别的地方?你确定这段代码可以运行吗?
  • 在 MyGame 中,我将其设置在 Additional_to_stage 在我调用 super(); 之后的构造函数中; addEventListener(Event.ADDED_TO_STAGE, handleAddedToStage); handleAddedToStage 调用另一个函数,该函数调用stage.scaleMode = StageScaleMode.SHOW_ALL;
  • 这里有更多信息。我使用的背景图像似乎被缩放,但其他图像没有。我不知道是否有不同的阶段,也许他们并不都设置相同
  • 通常一个 Flex 应用程序只有一个阶段。我不知道 Flash 是否支持多个阶段。除此之外,您正在做的事情听起来像是正确的方法。也许您需要强制重绘 UIComponent 容器以使其调整游戏大小?
  • 似乎任何正在补间的对象都没有正确缩放,这恰好是几乎所有东西

标签: apache-flex flex-mobile


【解决方案1】:

移动设备屏幕具有不同的屏幕密度或 DPI(每英寸点数)。您可以将 DPI 值指定为 160、240 或 320,具体取决于目标设备的屏幕密度。当您启用自动缩放时,Flex 会针对每个设备的屏幕密度优化其显示应用程序的方式。

例如,假设您将目标 DPI 值指定为 160 并启用自动缩放。当您在 DPI 值为 320 的设备上运行应用程序时,Flex 会自动将应用程序缩放 2 倍。也就是说,Flex 会将所有内容放大 200%。

要指定目标 DPI 值,请将其设置为主应用程序文件中标记或标记的 applicationDPI 属性:

<s:ViewNavigatorApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
xmlns:s="library://ns.adobe.com/flex/spark" 
firstView="views.HomeView" 
applicationDPI="160">

如果您选择不自动缩放应用程序,则必须根据需要手动处理布局的密度变化。

设备可以有不同的屏幕尺寸或分辨率以及不同的 DPI 值或密度。

分辨率是高像素数乘以宽像素数:即设备支持的总像素数。

DPI 是每平方英寸的点数:即设备屏幕上的像素密度。术语 DPI 可与 PPI(每英寸像素数)互换使用。

applicationDPI(如果已设置)指定应用程序的目标 DPI。 Flex 会自动应用比例因子以很好地适应具有不同 DPI 值的其他设备。

Capabilities.screenDPI是当前设备的具体DPI值。

runtimeDPI 类似于 Capabilities.screenDPI。此值是当前设备 DPI,四舍五入为 DPIClassification 类定义的常量之一(160、240 和 320 DPI)。

如果您想知道当前屏幕上组件的实际尺寸(宽度和高度),您需要使用以下比例因子:

var scaleFactor:Number = runtimeDPI / applicationDPI;

var currentComponentSize:int =componentSize.height * scaleFactor;

如果您无法访问 applicationDPI 和 runtimeDPI 值,您可以使用 Capabilities.screenDPI 手动计算 scaleFactor:

   // Copy the applicationDPI setted in your application. ie:
    var _applicationDPI:int = 160;
    var _runtimeDPI:int;

    if(Capabilities.screenDPI < 200)
         _runtimeDPI = 160;
    else if(Capabilities.screenDPI >=200 && Capabilities.screenDPI < 280)
        _runtimeDPI = 240
    else if (Capabilities.screenDPI >=280)
        _runtimeDPI = 320;

    var scaleFactor:Number = _runtimeDPI / _applicationDPI;

    var currentComponentSize:int =componentSize.height * scaleFactor;

http://www.francescoflorio.info/?p=234

【讨论】:

    猜你喜欢
    • 2012-02-13
    • 2016-08-05
    • 1970-01-01
    • 2014-05-30
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多