注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

清风的博客

我为人人,人人为我。

 
 
 

日志

 
 

AS3 Motion类  

2014-03-21 19:12:32|  分类: 【flash教程】 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

例子展示:
        http://www.webjx.com/files/media/Motion.swf
        这个类貌似是多余的,反正就是Tween类,但是解决了动画可能播到一半就停止了等问题,Tween播放到一半就停止了原因是因为类中的侦听EnterFrame事件的时候,使用的是弱引用侦听方式,在播放的途中,被内存自动回收了,因此播放到一半就夭折了,解决办法嘛,除了自己写一个,也可以去包中改一下Tween,把侦听改成强引用就行了我个人是不太习惯使用Tween的,因此我就写了这个类,自己使用嘛,大家觉得还不错就拿去用吧缓动的算法还是使用ADOBE自带的那个asing包这个类属性和方法比较多。
类讲解:
index.base.animation.Motion类:
代码:public class Motion extends EventDispatcher
提供给程序员使用的动画类
构造函数:
public function Motion(target_:*,_attribute:String,_algorithm:Function,_begin:Number,_end:Number,_duration:uint = 10)
与Tween一模一样,只不过最后少了个属性是是否以时间计算缓动,而该类只有以帧频计算缓动
play方法:
public function play():void
开始播放,并触发播放事件
如果正在播放,调用该方法不会有什么变化,只不过会触发播放事件
back方法:
public function back():void
同于play方法,不同的是该方法是让动画反过来播放
resume方法:
public function resume():void
继续播放,依然会触发播放事件
stop方法:
public function stop():void
停止播放,触发停止事件
如果是播放完毕了,即还会触发播放完毕事件
停止事件永远比播放完毕事件提前调度
reset方法:
public function reset():void
重置动画,还原到刚开始实例化的状态
无论是否正在播放,都会触发停止事件
forward方法:
public function forward():void
快进到最后
rewind方法:
public function rewind():void
倒带到最前
next方法:
public function next():void
向前播放一帧
如果是在播放中使用该方法,效果不是太明显
prev方法:
public function prev():void
向前播放一帧
如果是在播放中使用该方法,效果不是太明显
clear方法:
public function clear():void
清除类中的引用,事件等
isBack属性(只读):
public function get isBack():Boolean
是否在回放状态
target属性(只读):
public function get target():*
获取当前操作的对象
current属性(只读):
public function get current():uint
获取当前播放的位置
playing属性(只读):
public function get playing():Boolean
是否正在播放
attribute属性:
public var attribute:String;
设置操作的对象属性,没必要的情况下最好不要修改
begin属性:
public var begin:Number;
设置操作的对象初始属性,没必要的情况下最好不要修改
end属性:
public var end:Number;
设置操作的对象结束属性,没必要的情况下最好不要修改
duration属性:
public var duration:uint;
设置对象从初始值,经过多少帧,才运动到结束值
algorithm属性:
public var algorithm:Function;
设置对象从初始值到结束值是以什么算法进行运动
受保护的属性:
protected var _current:uint = 0;
protected function updata(isInit:Boolean = false):void
如果继承该类,则可以访问_current属性和updata方法,可以直接修改当前帧和强制更新屏幕
举例:(上面那个展示flash的源代码)
对于各种不同的算法,进行效果展示,小小的偷了一下懒,使用的flash自带组件。。

CODE:


import fl.transitions.easing.*;
import index.base.animation.Motion;
import index.base.events.MotionEvent;
//算法数组
var classAr:Array = [Back,Bounce,Elastic,None,Regular,Strong];
//初始小方块
var mc:MC = new MC;
mc.y = 150;
addChild(mc);
//动画声明
var motion:Motion = new Motion(mc,"x",Back.easeIn,50,350,40);
motion.addEventListener(MotionEvent.MOTION_UPDATA,motionUpdataFun);
motion.addEventListener(MotionEvent.MOTION_STOP,motionStopFun);
motion.addEventListener(MotionEvent.MOTION_PLAY,motionPlayFun);
motion.addEventListener(MotionEvent.MOTION_FINISH,motionFinishFun);
motion.play();
//动画播放完毕
function motionFinishFun(e:MotionEvent){
        traceText.appendText("播放完毕\n");
        motion.isBack ? motion.play() : motion.back();
        traceText.scrollV = traceText.maxScrollV;
}
//屏幕更新
function motionUpdataFun(e:MotionEvent){
        currentText.text = motion.current.toString();
        traceText.appendText("屏幕更新,当前帧 " + motion.current + ",X属性:" + mc.x + "\n");
        traceText.scrollV = traceText.maxScrollV;
}
//动画播放
function motionPlayFun(e:MotionEvent){
        traceText.appendText("开始播放\n");
        traceText.scrollV = traceText.maxScrollV;
}
//动画停止
function motionStopFun(e:MotionEvent){
        traceText.appendText("停止播放\n");
        traceText.scrollV = traceText.maxScrollV;
}
//侦听各个面板的change事件
classList.addEventListener("change",changeFun);
funcList.addEventListener("change",changeFun);
durationBar.addEventListener("change",changeFun);
playButton.addEventListener("click",clickFun);
//当属性面板发生数值改变,即触发
function changeFun(e:Event){
        motion.rewind();
        motion.algorithm = classAr[classList.selectedItem.data][funcList.selectedItem.data];
        motion.duration = durationBar.value;
       
        durationText.text = durationBar.value.toString();
}
//播放按钮
function clickFun(e:Event){
        if(playButton.selected) motion.resume();
        else motion.stop();
}
//4个倒带前进等按钮事件
prevButton.addEventListener(MouseEvent.CLICK,function(){motion.prev()});
nextButton.addEventListener(MouseEvent.CLICK,function(){motion.next()});
forwardButton.addEventListener(MouseEvent.CLICK,function(){motion.forward()});
rewindButton.addEventListener(MouseEvent.CLICK,function(){motion.rewind()});
类源代码:

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);
                }
        }
}

  评论这张
 
阅读(70)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017