
面向对象编程学习5.doc
6页精品文档】如有侵权,请联系网站删除,仅供学习与交流面向对象编程学习5.....精品文档......面向对象编程学习( 五 )独来读网一事件处理机制一, 自定义事件我们先做一个实例,再说原理,画一个小球,小球的X坐标发生改变,就执行一个函数代码如下://aspackage { import flash.display.Sprite; import flash.events.Event; public class Ball extends Sprite { private var radius:Number private var color:uint; private var isX:Boolean; public function Ball(r:Number=30,c:uint=0xff0000) { radius=r; color=c; init(); private function init():void { graphics.beginGradientFill("radial",[0xffffff,color],[1,1],[0,radius*3]); graphics.drawCircle(0,0,radius); graphics.endFill(); override public function set x(x1:Number):void { super.x=x1; if (isX) { dispatchEvent(new Event("changex")); public function set isChangeX(isX:Boolean):void { this.isX=isX; public function get isChangeX():Boolean { return isX;//flavar ball:Ball=new Ball(20,0x0000ff);addChild(ball);ball.y=100;var a:Number=0;var n:int=0;addEventListener(Event.ENTER_FRAME ,fun);function fun(e:Event) { if ((n%40)<20) { ball.x=275+Math.cos(a)*150; a+=0.05; n++;var num:int=20;var ang:Number=0;var arr:Array=[];for (var i:int=0; i 其实这里定义了一个自定义事件,我们象学其它内置方法一样,不知道它的实现过程,也能用它,只要你定义的对象继承了EventDispatcher类和复合了EventDispatcher对象或实现IEventDispatcher接口了,因为EventDispatcher类和IEventDispatcher接口中定义了二个方法,分别是:addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void(今天只说前面两个参数)和dispatchEvent(event:Event):Boolean)这二个方法联合使用时的要求如下:方法1和方法2是实例对象的两个方法,可在不同的环境中,分别执行,这样就能很好地控制“要执行的函数listener”的执行的时机先执行方法1,那么什么时候执行方法2,就什么时候执行“要执行的函数listener”那相同的字符串就是我们平时说的事件类型在上面的实例中,实例的x坐标发生改变,override public function set x(x1:Number):void { super.x=x1; if (isX) { this.dispatchEvent(new Event("changex"));就是调用了:this.dispatchEvent(new Event("changex"));,该方法前面的this就是实例ball,这方法一旦调用,就执行ball.addEventListener("changex",fx);中fx的函数。 为什么Ball类的实例能有addEventListener ,dispatchEvent方法是因为Ball extends Sprite,Sprite又继承了EventDispatcher类二, 模拟事件机制原理为了能理解这两个方法的原理,现在我们不用它俩,自己写出方法的实现过程建一个事件类,为了不与内置的发生冲突,事件类名为:EventEpackage { public class EventE { public static const CHANGEX:String="changex"; private var _target:Object; private var _type:String; public function EventE(s:String) { _type=s; public function get type():String { return _type; public function get target():Object { return _target; public function set target(m:Object):void { _target=m;Ball类,现在我们不用继承的addEventListener和dispatchEvent方法,为了不发生冲突,分别改为:addEvent和dispatch,下面代码粗体部分,为我们模拟的方法,package { import flash.display.Sprite; import flash.events.Event; public class Ball extends Sprite { private var radius:Number; private var color:uint; private var isX:Boolean; private var fun:Function; private var str:String; public function Ball(r:Number=30,c:uint=0xff0000) { radius=r; color=c; init(); private function init():void { graphics.beginGradientFill("radial",[0xffffff,color],[1,1],[0,radius*3]); graphics.drawCircle(0,0,radius); graphics.endFill(); override public function set x(x1:Number):void { super.x=x1; if (isX) { dispatch(new EventE(EventE.CHANGEX)); public function set isChangeX(isX:Boolean):void { this.isX=isX; public function get isChangeX():Boolean { return isX; public function addEvent(s:String,f:Function) { str=s; fun=f; public function dispatch(e:EventE) { if (str==EventE.CHANGEX) { e.target=this; fun(e);//fla,粗体部分,是调用我们定义的方法,与原类只稍做改,var ball:Ball=new Ball(20,0x0000ff);addChild(ball);ball.y=100;var a:Number=0;addEventListener(Event.ENTER_FRAME ,fun);var n:int=0;function fun(e:Event) { if ((n%40)<20) { ball.x=275+Math.cos(a)*150; a+=0.05; n++;var num:int=20;var ang:Number=0;var arr:Array=[];for (var i:int=0; i 只要执行实例.dispatch(new EventE(EventE.CHANGEX));ff函数就会执行希望上面所述对您有所帮助三, 实例我们计划建一个能加载图片的类,给你一些网址,利用这个类的功能,放入网址返回一个数组,这个数组里的元素就是我们要的图片,并且是显示对象package { import flash.display.Loader; import .URLRequest; import flash.display.Bitmap; import flash.events.Event; import flash.events.Eve。
