我想基于actionscript3构建一个项目。它需要调整其舞台区域的大小以适应客户的Web浏览器的查看大小,或者在客户更改Web浏览器的大小时适合它。
没有固定的宽高比,但具有最小尺寸(例如640x480)和最大尺寸(1600x1000)。当客户的Web窗口长度小于最小尺寸时,该维度中会出现一个滚动条,因此用户可以使用滚动条查看整个阶段。当客户的Web窗口大小超过最大大小时,将出现Flash应用程序在顶部中心。它需要在大多数Web浏览器上工作,包括IE 6。
当舞台大小改变时,舞台上的内容不会缩放。在我的情况下,该项目有几十个视图,每个视图需要处理大小变化并重新排列其元素,我认为这将是一个巨大的工作,所以需要任何建议来建立这样的项目。
答案 0 :(得分:2)
首先,调整大小将由JavaScript / CSS管理,而不是ActionScript。也就是说,在ActionScript中需要做一些事情来准备这种行为。
首先,您提到您不希望SWF中的所有内容都与网页一起扩展。要解决此默认行为,您需要更改该阶段将使用的scale mode
:
stage.scaleMode = StageScaleMode.NO_SCALE;
我发现另一件让可扩展网站更易于使用的是将SWF的左上角设置为0,0。默认情况下,如果放大SWF,0,0将保留在同一位置,其中一些“填充”表示新的大小。我的意思是,如果你将SWF向上扩展200像素并且最初是400像素,则0,0将从左侧落入SWF 100像素而不是左上角。以下是您可以采取的措施来纠正错误:
stage.align = StageAlign.TOP_LEFT;
这两件事将有助于您的嵌入式SWF以更加预期的方式行事,这可能会在整个项目中为您提供帮助。
最后,您提到屏幕上有许多可查看对象需要对正在调整大小的舞台/浏览器窗口作出反应。使用Event.RESIZE
很容易处理。您可以将监听器附加到stage
以处理此事件,并将信息传递给反映更改的每个可查看对象。
您可以创建一个具有handleResize()
方法的类,该方法将是视图对象的基类:
class ViewComponent extends Sprite
{
public function handleResize(width:int, height:int):void
{
trace(width, height);
}
}
这些对象中的每一个都可以列在管理整体视图的另一个类中,如下所示:
class ViewManager extends Sprite
{
public var viewComponents:Vector.<ViewComponent>;
public function ViewManager(stage:Stage)
{
viewComponents = new Vector.<ViewComponent>();
stage.addEventListener(Event.RESIZE, _manageResize);
}
private function _manageResize(e:Event):void
{
for each(var i:ViewComponent in viewComponents)
{
i.handleResize(e.target.stageWidth, e.target.stageHeight);
}
}
}
通过这种方式,您只需在ViewComponent
中列出ViewManager
,然后通过覆盖handleResize()
来适当处理每个{{1}}。