Flash AS3教程:Motion类(1)
前面教程学习了Flash AS3教程:Random类,这篇我们一起来学习Motion类的使用方法和实例。 <br /><br />先来一个例子展示:<br />http://www.webjx.com/files/media/Motion.swf<br /><br />这个类貌似是多余的,反正就是Tween类,但是解决了动画可能播到一半就停止了等问题,Tween播放到一半就停止了原因是因为类中的侦听EnterFrame事件的时候,使用的是弱引用侦听方式,在播放的途中,被内存自动回收了,因此播放到一半就夭折了,解决办法嘛,除了自己写一个,也可以去包中改一下Tween,把侦听改成强引用就行了<br />我个人是不太习惯使用Tween的,因此我就写了这个类,自己使用嘛,大家觉得还不错就拿去用吧<br />缓动的算法还是使用ADOBE自带的那个easing包<br />这个类属性和方法比较多。。耐心看吧,跟Tween差不了太多的<br /><br />类讲解:<br />index.base.animation.Motion类:<br />代码:public class Motion extends EventDispatcher<br />提供给程序员使用的动画类<br /><br />构造函数:<br />public function Motion(target_:*,_attribute:String,_algorithm:Function,_begin:Number,_end:Number,_duration:uint = 10)<br />与Tween一模一样,只不过最后少了个属性是是否以时间计算缓动,而该类只有以帧频计算缓动<br /><br />play方法:<br />public function play():void<br />开始播放,并触发播放事件<br />如果正在播放,调用该方法不会有什么变化,只不过会触发播放事件<br /><br />back方法:<br />public function back():void<br />同于play方法,不同的是该方法是让动画反过来播放<br /><br />resume方法:<br />public function resume():void<br />继续播放,依然会触发播放事件<br /><br />stop方法:<br />public function stop():void<br />停止播放,触发停止事件<br />如果是播放完毕了,即还会触发播放完毕事件<br />停止事件永远比播放完毕事件提前调度<br /><br />reset方法:<br />public function reset():void<br />重置动画,还原到刚开始实例化的状态<br />无论是否正在播放,都会触发停止事件<br /><br />forward方法:<br />public function forward():void<br />快进到最后<br /><br />rewind方法:<br />public function rewind():void<br />倒带到最前<br /><br />next方法:<br />public function next():void<br />向前播放一帧<br />如果是在播放中使用该方法,效果不是太明显<br /><br />prev方法:<br />public function prev():void<br />向前播放一帧<br />如果是在播放中使用该方法,效果不是太明显<br /><br />clear方法:<br />public function clear():void<br />清除类中的引用,事件等<br /><br />isBack属性(只读):<br />public function get isBack():Boolean<br />是否在回放状态<br /><br />target属性(只读):<br />public function get target():*<br />获取当前操作的对象<br /><br />current属性(只读):<br />public function get current():uint<br />获取当前播放的位置<br /><br />playing属性(只读):<br />public function get playing():Boolean<br />是否正在播放<br /><br />attribute属性:<br />public var attribute:String;<br />设置操作的对象属性,没必要的情况下最好不要修改<br /><br />begin属性:<br />public var begin:Number;<br />设置操作的对象初始属性,没必要的情况下最好不要修改<br /><br />end属性:<br />public var end:Number;<br />设置操作的对象结束属性,没必要的情况下最好不要修改<br /><br />duration属性:<br />public var duration:uint;<br />设置对象从初始值,经过多少帧,才运动到结束值<br /><br />algorithm属性:<br />public var algorithm:Function;<br />设置对象从初始值到结束值是以什么算法进行运动<br /><br />受保护的属性:<br />protected var _current:uint = 0;<br />protected function updata(isInit:Boolean = false):void<br />如果继承该类,则可以访问_current属性和updata方法,可以直接修改当前帧和强制更新屏幕<br /><br />举例:(上面那个展示flash的源代码)<br />对于各种不同的算法,进行效果展示,小小的偷了一下懒,使用的flash自带组件。。<br /><br />CODE:<br />import fl.transitions.easing.*;<br />import index.base.animation.Motion;<br />import index.base.events.MotionEvent;<br /><br />//算法数组<br />var classAr:Array = ;<br /><br />//初始小方块<br />var mc:MC = new MC;<br />mc.y = 150;<br />addChild(mc);<br /><br />//动画声明<br />var motion:Motion = new Motion(mc,"x",Back.easeIn,50,350,40);<br />motion.addEventListener(MotionEvent.MOTION_UPDATA,motionUpdataFun);<br />motion.addEventListener(MotionEvent.MOTION_STOP,motionStopFun);<br />motion.addEventListener(MotionEvent.MOTION_PLAY,motionPlayFun);<br />motion.addEventListener(MotionEvent.MOTION_FINISH,motionFinishFun);<br />motion.play();<br /><br />//动画播放完毕<br />function motionFinishFun(e:MotionEvent){<br /> traceText.appendText("播放完毕\n");<br /> motion.isBack ? motion.play() : motion.back();<br /> traceText.scrollV = traceText.maxScrollV;<br />}<br /><br />//屏幕更新<br />function motionUpdataFun(e:MotionEvent){<br /> currentText.text = motion.current.toString();<br /> traceText.appendText("屏幕更新,当前帧 " + motion.current + ",X属性:" + mc.x + "\n");<br /> traceText.scrollV = traceText.maxScrollV;<br />}<br /><br />//动画播放<br />function motionPlayFun(e:MotionEvent){<br /> traceText.appendText("开始播放\n");<br /> traceText.scrollV = traceText.maxScrollV;<br />}<br /><br />//动画停止<br />function motionStopFun(e:MotionEvent){<br /> traceText.appendText("停止播放\n");<br /> traceText.scrollV = traceText.maxScrollV;<br />}<br /><br />//侦听各个面板的change事件<br />classList.addEventListener("change",changeFun);<br />funcList.addEventListener("change",changeFun);<br />durationBar.addEventListener("change",changeFun);<br />playButton.addEventListener("click",clickFun);<br /><br />//当属性面板发生数值改变,即触发<br />function changeFun(e:Event){<br /> motion.rewind();<br /> motion.algorithm = classAr;<br /> motion.duration = durationBar.value;<br /> <br /> durationText.text = durationBar.value.toString();<br />}<br /><br />//播放按钮<br />function clickFun(e:Event){<br /> if(playButton.selected) motion.resume();<br /> else motion.stop();<br />}<br /><br />//4个倒带前进等按钮事件<br />prevButton.addEventListener(MouseEvent.CLICK,function(){motion.prev()});<br />nextButton.addEventListener(MouseEvent.CLICK,function(){motion.next()});<br />forwardButton.addEventListener(MouseEvent.CLICK,function(){motion.forward()});<br />rewindButton.addEventListener(MouseEvent.CLICK,function(){motion.rewind()});<br /><br /><blockquote class="blockquote">From: http://www.photoep.cn/read.php?tid=97Powered by PHPWind.com</blockquote>
页:
[1]