以下是 NativeWindow 的事件列表:
Code:
displayStateChange
displayStateChanging
move
moving
resize
resizing
close
closing
我想一看就明白各2个事件成为一对。定义了对窗口的4种操作的紧接之前和完成后各自的状态的事件。
ing 结束的事件赋予像警告一样的地位,在处理事件完成前,可以确认状况,根据场合的不同取消处理等。为此 ing结束的事件全都是可以取消的。
另一方面,不以ing 结束的事件是通知完成后的事件。需要事后处理的情况使用。
下面稍微详细地查看以下各个事件。
NativeWindowDisplayStateEvent
是首先有关 displayState 属性变更的事件。displayStateChanging 是NativeWindow 对象的 displayState 被变更的紧接之前,而displayStateChange 是根据 displayState 被变更了之后的 NativeWindow 的处理(dispatch)。
这个时候dispatch的事件对象的形式为 flash.events.NativeWindowDisplayStateEvent 。这个对象的事件有着 beforeDisplayState 和 afterDisplayState 的属性,表示各自变更前的值和变更后的值。
因为在displayStateChanging 事件的情况下变更还没完成,在接收了事件的时刻的 displayState 属性的值就是 beforeDisplayState 。但在 displayStateChange 事件的情况下变更已经进行,那个时刻的 displayState 属性的值就是 afterDisplayState 。
下面来写一个例子。首先,确认程序配置文件(
程序名-app.xml)的 rootContent 标签的 systemChrome 为 standard 。
Code:XML
<rootContent systemChrome="standard" transparent="false" visible="true">[SWF reference is generated]</rootContent>
下面的例子是在 applicationComplete事件里添加listener (onDispStateEvent)。在onDispStateEvent 里面 trace()输出事件信息,请用debug 方式执行。
Code: MXML
<?xml version="1.0" encoding="utf-8"?>
<mx:ApolloApplication xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="addListeners()">
<mx:Script>
<![CDATA[
private function addListeners():void {
stage.window.addEventListener( NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGE, onDispStateEvent);
stage.window.addEventListener( NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGING, onDispStateEvent);
}
private function onDispStateEvent(e:NativeWindowDisplayStateEvent):void {
trace("type:", e.type, e.afterDisplayState);
}
private function onMinBtnClick(e:MouseEvent):void {
stage.window.minimize();
}
private function onMaxBtnClick(e:MouseEvent):void {
if (stage.window.displayState != NativeWindowDisplayState.MAXIMIZED) {
stage.window.maximize();
maxBtn.label = "v";
}else{
stage.window.restore();
maxBtn.label = "\u25A2";
}
}
private function onCloseBtnClick(e:MouseEvent):void {
stage.window.close();
}
]]>
</mx:Script>
<mx:HBox width="100%" backgroundColor="#ffffff">
<mx:Button id="minBtn" label="_" click="onMinBtnClick(event)" />
<mx:Button id="maxBtn" label='{"\u25A2"}' click="onMaxBtnClick(event)" />
<mx:Button id="closeBtn" label="X" click="onCloseBtnClick(event)" />
</mx:HBox>
<mx:HBox width="100%" height="100%" backgroundColor="#ffffff"/>
</mx:ApolloApplication>
有人可能会注意到系统chrome的最小化/最大化按钮和窗口内的最小化/最大化按钮的事件有些差异。
由系统chrome的按钮来最大化窗口会触发 displayStateChanging 和 displayStateChange 两个事件。
但如果按了窗口内的按钮来最大化窗口,displayStateChange 事件以外的不会发生。(即 ing 事件不会发生)。
这是因为由系统chrome的按钮来最大化窗口的话,他考虑到处理实际被进行之前的对应 。为此,NativeWindow 自动地做了 displayStateChanging dispatch。
但如果按窗口内的按钮来调用 minimize()等方法,处理实际被进行之前的对应应该是可以的(在minimize()等方法里写)。为此即使调用了 minimize(), maximize(), restore(), displayStateChanging 也不自动dispatch。
如果想在 minimize()等调用后,触发 displayStateChanging 事件的话,也可以追加以下语句:
Code: Actionscript
private function onMinBtnClick(e:MouseEvent):void {
stage.window.minimize();
var dispStateEvent:NativeWindowDisplayStateEvent = new NativeWindowDisplayStateEvent(
NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGING, true, true,
stage.window.displayState, NativeWindowDisplayState.MINIMIZED);
stage.window.dispatchEvent(dispStateEvent);
}
这样,就与由系统chrome的按钮来最大化窗口是一样的了。把程序配置文件(程序名-app.xml)的 rootContent 标签的 systemChrome 变为 none 就可以看到效果了。
未完待续。