以下是 NativeWindow 的事件列表:
displayStateChange //NativeWindow 对象的 displayState 属性被变更后
displayStateChanging //NativeWindow 对象的 displayState 属性被变更前
move //NativeWindow 对象在桌面上移动后
moving //NativeWindow 对象在桌面上移动前
resize //NativeWindow 对象改变大小后
resizing //NativeWindow 对象改变大小前
close //NativeWindow 对象被关闭后
closing //NativeWindow 对象被关闭前
我想一看就明白各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 。
<rootContent systemChrome="standard" transparent="false" visible="true">[SWF reference is generated]</rootContent>
下面的例子是在 applicationComplete事件里添加listener (onDispStateEvent)。在onDispStateEvent 里面 trace()输出事件信息,请用debug 方式执行。
<?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 事件的话,也可以追加以下语句:
//以minimize()为例
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 就可以看到效果了。
未完待续。
没有评论:
发表评论