11RIA 闪客社区 - 最赞 Animate Flash 论坛

搜索
查看: 2311|回复: 9
上一主题 下一主题

[事件机制] 事件(小练习)

[复制链接] TA的其它主题
发表于 2019-1-14 15:48:45 | 显示全部楼层 |阅读模式

【游客模式】——注册会员,加入11RIA 闪客社区吧!一起见证Flash的再次辉煌……

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
[Actionscript3] 纯文本查看 复制代码
//文档类
package  {
	
	import flash.display.Sprite;
    import son.Students;
    import son.Techer;
    import son.EventSa;
	
	public class doc extends Sprite {
		//生成教师和学生的实例;
		var te:Techer=new Techer();
		var stu:Students=new Students();
		public function doc() {
		//用下面的方法给教师添加一个事件侦听器;
		te.addEventListener(EventSa.CLASS_EV,stu.study);
		//用下面的方法发送事件;
		//注意:事件必须先注册,后发送否则侦听函数接收不到;
		te.Cla("数学");

		}
	}
	
}

//定义一个事件类;

package son {
	import flash.events.Event;
	public class EventSa extends Event{
	//给自定义的事件取一个名称,用静态常量表示;
	public static const CLASS_EV:String="上课事件";
    //定义一个事件科目;
	private var _claSub:String="";
		public function EventSa() {
			//用super方法给自定义的事件命名;
			super(CLASS_EV)// constructor code
		}
		
	//设置get和set方法;
    public function set claSub(e:String):void{
	     _claSub=e;
	}
	public function get claSub():String{
		return _claSub;
		}
	
	}
	
}

//定义一个教师类;
package son {
	//导入一个可以发送事件的类;
	import flash.events.EventDispatcher;
	//教师类必须继承EventDispatcher类,否则无法发送事件;
	public class Techer extends EventDispatcher{
   //给教师类复合一个自定义的事件类,用来发送;
    public var ev:EventSa;
		public function Techer() {
			init();
			trace("同学们,上课了!!")// constructor code
		}
		//定义一个初始化事件类的方法;
    private function init(){
	    ev=new EventSa();
	
	}
	//定义一个方法,给用事件赋值并发送事件;
	public function Cla(st:String){
		ev.claSub=st;
		trace("这节课是:"+ev.claSub+"课");
		//用下面的方法发送事件;
	    dispatchEvent(ev);
		
		}
	
	}
	
}

//定义一个学生类;

package  son{
	
	public class Students {

		public function Students() {
			// constructor code
		}
		//给学生添加一个处理事件的方法,即:侦听器方法;
public function study(ev:EventSa):void{
	trace("全体起立!");
	
	trace(ev.claSub+"老师好!!!");
	
	}
	}
	
}

 楼主| 发表于 2019-1-14 16:13:50 | 显示全部楼层
学习感受:
1,事件很抽象,学习起来很吃力,对于教材要认真阅读!每一个字都不放过!
2,有两个类要区分开:Event和EventDispatcher,这是两个不同的类,一个用来生成事件,一个用来发送事件!
3,要为自定义的事件添加一个静态常量,作为事件的名称,否则你定义的事件将无法使用!
4,在发送事件之前要先注册侦听器,否则,事件发送出去了,没人接收,发出的事件也就没有意义了!
5,注册侦听器的方法是:addEventListener,但是,并不是所有的对象都可以注册侦听器,
      只有EventDispatcher的子类才可以注册侦听器!
学习中的疑惑:
1,事件类中的静态常量只能有一个还是可以有很多个?如果是多个,那么应该怎么实现不同的常量对应不同的事件?
2,事件类和事件的发送类为什么不做成同一个类的不同属性或方法,
         而要做成两个不同的类,这样脱离开来是不是有点麻烦?
3,事件的发送是怎样一个过程,它是像电磁波似的广泛的发送给全体对象,
        还是像数组的访问似的,要把对象一个一个的遍历呢?
4,事件的发送是从哪里开始的?根什么意思?事件的发送者不是根吗?
回复

使用道具 举报

发表于 2019-1-14 16:55:28 | 显示全部楼层
3,要为自定义的事件添加一个静态常量,作为事件的名称,否则你定义的事件将无法使用!
不需要静态常量也可以,只要记住发送事件时候设置的事件类型字符串即可。
不过定义常量是个好习惯。

4,在发送事件之前要先注册侦听器,否则,事件发送出去了,没人接收,发出的事件也就没有意义了!
事实上很多事件都是默认会被监听,如果不侦听也无所谓,反正我需要发送事件的时候就发。。。
例如:记得小时候经常街道上有人骑着三轮车卖各种东西,他们走十几米就吆喝一两声。。其实这个吆喝就是发送事件,至于有没有人接收事件(吆喝),他不管,默认有人会听到(也就是有人可能会侦听,但没人侦听也会吆喝,发送事件)。。。

学习中的疑惑:
1,事件类中的静态常量只能有一个还是可以有很多个?如果是多个,那么应该怎么实现不同的常量对应不同的事件?
还是以上面卖东西吆喝为例。
如果有很多商品,是不是要发送很多事件(卖花生,粮油,酱油香醋)。。。。
其实这个时候有两个选择:
一个是多个常量(多个事件类型字符串)。
第二个选择是,一个事件,带参数。。也就是给事件对象携带一个变量,用于记录自己的吆喝是 花生,还是毛豆,或者其他。

至于用那个选择,就看程序的具体场景了。
一般的规则是同一个类型的事件,就用第二个选择。
不同类型的事件,就用第一个选择。

2,事件类和事件的发送类为什么不做成同一个类的不同属性或方法,
这样设计是合理的。。。
这个其实主要是因为继承的原因。。
一个对象又是事件,又是事件发送者,那他发的事件对象是谁呢?把自己发出去吗?明显不合适。
以前面吆喝为例,吆喝发送的,是声音。。而声音发送者,是人。。。总不能把人和声音变成一个对象吧~~

3,事件的发送是怎样一个过程,它是像电磁波似的广泛的发送给全体对象。
这个有点类似以前的电话接收中心,但不一样的是你不需要知道打给谁。
你打了电话(发送事件),但是没有确定的接收人,于是接收中心查询有没有人,想接听你的电话(有对象监听了 指定对象 的 指定事件),于是找到了就给那个想听你电话的人发电话,而且可以群发。

当然这是最基础的事件机制,还有一个特殊的显示对象列表的,事件流机制,主要是鼠标,触摸交互事件的机制。

4,事件的发送是从哪里开始的?根什么意思?事件的发送者不是根吗?
事件发送者,就是源头,就是target对象。。
currentTarget是当前接收这个事件的对象。。
回复

使用道具 举报

 楼主| 发表于 2019-1-14 18:24:06 | 显示全部楼层
首先,感谢T老师为我解答,举的例子很直观,很好理解!谢谢!
但是,还是有两个问题不明白:
1,事件可以带参数?有实现方案吗?
2,事件的源头是发送者,那么,捕获阶段和冒泡阶段怎么理解?
      是发送者到接收者,再从接收者返回发送者吗?
回复

使用道具 举报

 楼主| 发表于 2019-1-14 19:13:44 | 显示全部楼层
发现了一个小失误:忘记移除侦听器!
再加上一句te.removeEventListener(EventSa.CLASS_EV,stu..study);
教材中强调:移除侦听器是事件中的必要步骤!
回复

使用道具 举报

发表于 2019-1-14 20:11:44 | 显示全部楼层
1,事件可以带参数?有实现方案吗?
定义事件类的时候,完全可以写一些自己需要的属性,在发送事件的前,把自己写的事件属性设置好对应的数据,然后发出去。侦听的函数中的,event对象就可以访问到你设置的事件属性。


2,事件的源头是发送者,那么,捕获阶段和冒泡阶段怎么理解?
      是发送者到接收者,再从接收者返回发送者吗?

对于新手,事件流机制稍微麻烦理解一些。其实可以回归问题的本质,事件机制是:
“发送者” 发送 “事件”,“侦听者” 侦听 “发送者” 的事件。
这里的核心问题是,事件机制要求必须,侦听者 侦听某个发送者的事件的时候,必须写明:XXX(发送者).addEventListener( XXX事件, 响应函数 );


但对于舞台对象,这样的规定会让代码写起来很繁琐。
显示机制的事件流机制,就是为了让显示对象的代码写起来简单,显示对象也非常适合事件流机制。

上面的代码要求必须是写明 XXX发送者.addEventListener,事件流机制好处就是不用这样写。
直接侦听舞台就可以响应所有的显示对象的鼠标点击,触摸点击等等。代码如下:
stage(舞台).addEventListener( XXX事件, 响应函数 );
在响应函数中,我们可以用  eve.target 对象,确定那个按钮,或者面板等被点击。。

当然除了舞台可以写,任何可以交互的显示对象都可以这样写,以此简化代码。

事件流机制就是最终简化代码的。。
回复

使用道具 举报

 楼主| 发表于 2019-1-14 21:37:10 | 显示全部楼层
TKCB 发表于 2019-1-14 20:11
1,事件可以带参数?有实现方案吗?
定义事件类的时候,完全可以写一些自己需要的属性,在发送事件的前,把 ...

再次感谢T老师的回复!你看我这样理解您的回复可不可以:
1,事件的参数是:
      就是在发送事件前把参数和其对应的属性写好,
      一并发送出去,
       在接收函数中访问写好的属性!
       应该是一个参数要对应一个侦听器!
2,事件流的理解:
        舞台对象是特殊的对象,它的事件流机制是简化后的!
      以后学习了舞台对象后可以更深入了解!
回复

使用道具 举报

发表于 2019-1-14 21:44:17 | 显示全部楼层
雪原xy 发表于 2019-1-14 21:37
再次感谢T老师的回复!你看我这样理解您的回复可不可以:
1,事件的参数是:
      就是在发送事件前把参数 ...

多练习,多理解,就好。。。因为是有练习了,才会深深理解,,
记得把自己的练习文件,分类整理好,注释好存储起来。。
可以看看我的淘贴里面的练习,都是固定格式的,因为我觉得那样的格式是练习最好的格式之一了。。
题目,参考,提示,按钮+说明,以及对应的注释。。
回复

使用道具 举报

 楼主| 发表于 2019-1-14 21:52:22 | 显示全部楼层
TKCB 发表于 2019-1-14 21:44
多练习,多理解,就好。。。因为是有练习了,才会深深理解,,
记得把自己的练习文件,分类整理好,注释 ...

好的,谢谢T老师指点!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

感谢所有支持论坛的朋友:下面展示最新的5位赞助和充值的朋友……更多赞助和充值朋友的信息,请查看:永远的感谢名单

SGlW(66139)、 anghuo(841)、 whdsyes(255)、 longxia(60904)、 囫囵吞澡(58054)

下面展示总排行榜的前3名(T1-T3)和今年排行榜的前3名的朋友(C1-C3)……更多信息,请查看:总排行榜今年排行榜

T1. fhqu1462(969)、 T2. lwlpluto(14232)、 T3. 1367926921(962)  |  C1. anghuo(147)、 C2. fdisker(27945)、 C3. 囫囵吞澡(58054)



快速回复 返回顶部 返回列表