文章出處

前面我們學習了Flash AS3教程:疑難雜癥匯總, 我們繼續學習AS3的index.base.func.OutDisplay類例子展示:點開觀看!
http://www.jb51.net/files/media/OutDisplay.swf

index.base.func.OutDisplay類講解:
當對象再一次觸發某事件的時候,判斷是否在事件范圍內,如果不在則調度Event.CANCEL事件

構造函數
public function OutDisplay(_type:String,_dis:DisplayObject,...objs)
第一個參數:偵聽類型
第二個參數:作用范圍,一般來說都是用Stage作為范圍,當然也有用在其他地方的
第三,四……個參數:可以擁有_type事件的對象
實例化后,偵聽_dis的_type事件,每當觸發_type事件,就開始判斷事件目標是否存在objs中,或者objs中某項的子集顯示對象,如果有則沒有反應,如果沒有則發出Event.CANCEL事件

add方法
public function add(...objs):Array
增加可以擁有_type事件的對象

objects屬性(只讀)
public function get objects():Array
返回可以擁有_type事件的對象列表

clear方法
public function clear(isDispatch:Boolean = false):void
清除類里面的偵聽,以及引用
第一個參數:如果為true,那么調用clear之后會發出Event.CANCEL,反之沒反應!默認為false

例子:
下面是展示flash的源代碼,這只是一個簡單應用,如果寫復雜一點,也可以寫出真正的快捷菜單

CODE:
import index.base.func.OutDisplay;

var menu:Menu = new Menu;
menu.mc1.addEventListener(MouseEvent.MOUSE_OVER,mouseOverFun);
menu.mc2.addEventListener(MouseEvent.MOUSE_OVER,mouseOverFun);
menu.mc3.addEventListener(MouseEvent.MOUSE_OVER,mouseOverFun);
menu.mc4.addEventListener(MouseEvent.MOUSE_OVER,mouseOverFun);
addChild(menu);

function mouseOverFun(e:MouseEvent){
var m:Menu = new Menu;
m.x = e.currentTarget.x e.currentTarget.parent.x;
m.y = e.currentTarget.y e.currentTarget.parent.y;
addChild(m);

var out:OutDisplay = new OutDisplay(MouseEvent.MOUSE_OVER,stage,e.currentTarget);
out.addEventListener(Event.CANCEL,cancelFun);
out.add(m);

m = null;
out = null;
}

function cancelFun(e:Event):void{
var out:OutDisplay = e.currentTarget as OutDisplay;
var tmpAr:Array = out.objects;
removeChild(tmpAr[1]);
out.removeEventListener(Event.CANCEL,cancelFun);

tmpAr = null;
out = null;
}
類的源代碼:

CODE:
package index.base.func{

import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
import flash.events.Event;
import flash.events.EventDispatcher;

public class OutDisplay extends EventDispatcher{

//保存所有對象
private var objAr:Array;
//保存偵聽類型
private var type:String;
//保存偵聽范圍
private var dis:DisplayObject;

//構造函數
public function OutDisplay(_type:String,_dis:DisplayObject,...objs){
type = _type;
objAr = objs;
dis = _dis;
dis.addEventListener(_type,fun);
}

//事件處理
private function fun(e:Event):void{
for(var i:uint = 0;i<objAr.length;i ){
if(e.target == objAr[i]) return;
if(objAr[i] is DisplayObjectContainer){
if(objAr[i].contains(e.target)) return;
}
}
dis.removeEventListener(type,fun);
dispatchEvent(new Event(Event.CANCEL));
}

//添加對象
public function add(...objs):Array{
for(var i:int = 0; i < objs.length; i ){
objAr.push(objs[i]);
}
return objects;
}

//獲取對象列表
public function get objects():Array{
return objAr;
}

//卸載
public function clear(isDispatch:Boolean = false):void{
if(isDispatch) dispatchEvent(new Event(Event.CANCEL));
dis.removeEventListener(type,fun);
objAr = null;
}

}
}


歡迎轉載:http://www.kanwencang.com/bangong/20161206/63901.html

文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()