Flash AS3教程:Motion类(2)
http://www.itjxue.com 2015-07-17 23:39 来源:未知 点击次数:
类源代码:
CODE:
package index.base.animation{
import flash.events.Event;
import flash.events.EventDispatcher;
import index.base.events.MotionEvent;
public class Motion extends EventDispatcher{
//公共属性
public var attribute:String;
public var begin:Number;
public var end:Number;
public var duration:uint;
public var algorithm:Function;
//受保护的属性
protected var _current:uint = 0;
//私有属性
private var _target:*;
private var _playing:Boolean = false;
private var _append:int = 1;
public function Motion(target_:*,_attribute:String,_algorithm:Function,_begin:Number,_end:Number,_duration:uint = 10){
_target = target_;
attribute = _attribute;
begin = _begin;
end = _end;
duration = _duration;
algorithm = _algorithm;
}
//开始播放
public function play():void{
_append = 1;
resume();
}
//回放
public function back():void{
_append = -1;
resume();
}
//继续播放
public function resume():void{
if(_playing) _target.removeEventListener(Event.ENTER_FRAME,enterFrameFun);
_playing = true;
_target.addEventListener(Event.ENTER_FRAME,enterFrameFun);
//触发开始播放事件
dispatchEvent(new MotionEvent(MotionEvent.MOTION_PLAY));
}
//帧频执行事件
private function enterFrameFun(e:Event):void{
if((_append == 1 && _current >= duration) || (_append == -1 && _current <= 0)){
stop();
}else{
_current += _append;
updata();
}
}
//停止播放
public function stop():void{
_playing = false;
_target.removeEventListener(Event.ENTER_FRAME,enterFrameFun);
//触发停止事件
dispatchEvent(new MotionEvent(MotionEvent.MOTION_STOP));
//触发播放完毕事件
if(_current == duration || _current == 0) dispatchEvent(new MotionEvent(MotionEvent.MOTION_FINISH));
}
//更新动画
protected function updata(isInit:Boolean = false):void{
if(isInit) _current = 0;
_target[attribute] = algorithm(_current,begin,end - begin,duration);
//触发屏幕更新事件
dispatchEvent(new MotionEvent(MotionEvent.MOTION_UPDATA));
}
//重置
public function reset():void{
stop();
updata(true);
_append = 1;
}
//前进到最后
public function forward():void{
_current = duration;
updata();
}
//倒带到最前
public function rewind():void{
_current = 0;
updata();
}
//快进一帧
public function next():void{
if(_current < duration){
_current += 1;
updata();
}
}
//后退一帧
public function prev():void{
if(_current > 0){
_current -= 1;
updata();
}
}
//清除
public function clear():void{
_target.removeEventListener(Event.ENTER_FRAME,enterFrameFun);
_target = null;
algorithm = null;
}
//获取是否为回放状态
public function get isBack():Boolean{
return Boolean(_append - 1);
}
//获取缓动目标
public function get target():*{
return _target;
}
//获取当前运行帧数
public function get current():uint{
return _current;
}
//获取当前是否在运行
public function get playing():Boolean{
return _playing;
}
}
}
事件类源代码:
CODE:
package index.base.events{
import flash.events.Event;
public class MotionEvent extends Event{
public static const MOTION_STOP:String = "motionStop";//播放停止
public static const MOTION_FINISH:String = "motionFinish";//播放完毕
public static const MOTION_PLAY:String = "motionPlay";//开始播放
public static const MOTION_UPDATA:String = "motionUpdata";//画面更新
public function MotionEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false){
super(type,bubbles,cancelable);
}
}
}