flash 事件流
包括3个过程:
查找,目标和冒泡 3个过程,
他是从最底层的displayobj开始搜寻,类似与树状结构搜寻,displaycontainer 中查找这些元件.以前有时会遇到事件的触发问题,例如事件被吃掉,事件被多个元件触发.这里需要注意下安排他们的层次例如要监听的对象和无关的不想被触发的对象保持兄弟接点的层次关系. 要想都触发保持父子的节点关系.
有时候我们不得不在一个父元件中添加子元件,同时父子元件都有事件需要监听。然而,父元件的范围比子元件大,点击父元件,而没有点到子元件 只响应父元件事件,点子元件(包含自父元件中)但却不要求父元件响应父元件的事件,只响应子元件事件。那么这个例子解决。
package
{
import flash.display.Sprite;
import flash.events.MouseEvent;
/**
* @author memory
* 事件流的测试
*/
public class TestEvent extends Sprite
{
public function TestEvent():void{
var sp:Sprite = new Sprite();
sp.graphics.beginFill(0×00ff00,1);
sp.graphics.drawCircle(100,100,100);
var sp1:Sprite = new Sprite();
sp1.graphics.beginFill(0xccff00,1);
sp1.graphics.drawCircle(130,130,50);
sp.addChild(sp1)
this.addChild(sp);
sp.addEventListener(MouseEvent.CLICK,__tellTarget1);
sp1.addEventListener(MouseEvent.CLICK,__tellTarget2);
}
private function __tellTarget1(e:MouseEvent):void{
trace(”target1 = “+e.currentTarget);
trace(” @@”+e.target);
if(e.currentTarget==e.target){
trace(”equal”);
}else{
trace(”sorry”);
}
}
private function __tellTarget2(e:MouseEvent):void{
//(e.target as Sprite).parent.(MouseEvent.CLICK,__tellTarget1);
trace(”target2 = “+e.currentTarget+” @@”+e.target);
//(e.target as Sprite).parent.addEventListener(MouseEvent.CLICK,__tellTarget1);
}
}
}
{
import flash.display.Sprite;
import flash.events.MouseEvent;
/**
* @author memory
* 事件流的测试
*/
public class TestEvent extends Sprite
{
public function TestEvent():void{
var sp:Sprite = new Sprite();
sp.graphics.beginFill(0×00ff00,1);
sp.graphics.drawCircle(100,100,100);
var sp1:Sprite = new Sprite();
sp1.graphics.beginFill(0xccff00,1);
sp1.graphics.drawCircle(130,130,50);
sp.addChild(sp1)
this.addChild(sp);
sp.addEventListener(MouseEvent.CLICK,__tellTarget1);
sp1.addEventListener(MouseEvent.CLICK,__tellTarget2);
}
private function __tellTarget1(e:MouseEvent):void{
trace(”target1 = “+e.currentTarget);
trace(” @@”+e.target);
if(e.currentTarget==e.target){
trace(”equal”);
}else{
trace(”sorry”);
}
}
private function __tellTarget2(e:MouseEvent):void{
//(e.target as Sprite).parent.(MouseEvent.CLICK,__tellTarget1);
trace(”target2 = “+e.currentTarget+” @@”+e.target);
//(e.target as Sprite).parent.addEventListener(MouseEvent.CLICK,__tellTarget1);
}
}
}
//———————-总结——————————
使用先移出监听在加监听,在子元件事件中是不行的,因为事件流的冒泡阶段还会遍历他的父元件。
通过判断 e.currentTarget==e.target 是否相同 即可知道事件触发的元件是不是该元件。解决。
注意通常事件是在target 和冒泡阶段调用元件的监听事件,可以设置修改添加监听的第3个参数true。但整个流程就会发生变化因为他不包含target 阶段
使用sp.mouseChildren=false; 可以忽略子元件的事件流,当成子元件不存在 sp.buttonMode =true; 出现手型按钮指示