AS3.0制作SWF文件播放进度控制条
以前见过不少播放控制条,但是大多都是针对flv视频播放的。当然也有针对SWF内部播放条控制的例子,但是比较少,而
且基本都是AS2版本的,在Flash CS3及以后的版本中都不适用。所以,下面以CS3为例,讲解一下如何使用AS3.0制作动画
自身的播放进度控制条。
(1)在制作好的flash文档中新建一个影片剪辑,取一个你自己喜欢的名字^_^,我的就叫“进度控制”。在里面还需要用
到两个元件(可以是影片剪辑也可以是图形),
这两个元件在“进度控制”影片剪辑中组合一下就成了我们的进度控制条,
这里有一个地方需要注意,就是两个小元件的注册点最好要重合(当然不重合也可以,但是后面规定滑块可移动范围的时
候需要注意,后面会具体讲到)。
(2)编写代码
1 //bar是进度条的名称,huakuai是滑块的名称 2 //滑块的状态 3 var drag:Boolean= false; 4 //动态获取滑块的x坐标 5 var huakuaiX:Number; 6 //滑块的滑动范围,前面两个参数分别是滑块和进度条重合的x和y坐标 7 var rect:Rectangle = new Rectangle(0, 80, bar.width, 0); 8 //ENTER_FRAME事件,即时更新滑块的位置 9 addEventListener(Event.ENTER_FRAME,EnterFrameHandler); 10 function EnterFrameHandler(e:Event):void{ 11 //自然播放的结果 12 if (drag == false) { 13 //获取主场景中的currentFrame和totalFrames,并算出滑块的x坐标 14 huakuaiX = root["currentFm"]/(root["totalFm"]/bar.width); 15 huakuai.x = huakuaiX; 16 } 17 //认为拖动之后的结果 18 if (drag == true) { 19 MovieClip(root).gotoAndStop(Math.floor((Math.abs(huakuai.x)+1)*(root["totalFm"]/bar.width))); 20 } 21 if (huakuai.x<=0 && drag == true) { 22 huakuai.x = 0; 23 MovieClip(root).gotoAndStop(1); 24 } 25 if (huakuai.x>=bar.width) { 26 drag = true; 27 } 28 } 29 30 //注册事件侦听 31 huakuai.addEventListener(MouseEvent.MOUSE_DOWN,huakuaiOnPress); 32 huakuai.addEventListener(MouseEvent.MOUSE_UP,huakuaiOnRelease); 33 bar.addEventListener(MouseEvent.MOUSE_DOWN,barOnPress); 34 bar.addEventListener(MouseEvent.MOUSE_UP,barOnRelease); 35 //事件侦听函数 36 function huakuaiOnPress(evt:MouseEvent):void{ 37 evt.target.startDrag(false,rect); 38 drag=true; 39 } 40 41 function huakuaiOnRelease(evt:MouseEvent):void{ 42 evt.target.stopDrag(); 43 drag=false; 44 MovieClip(root).play(); 45 } 46 47 function barOnPress(evt:MouseEvent):void{ 48 drag=true; 49 huakuai.x=mouseX; 50 } 51 function barOnRelease(evt:MouseEvent):void{ 52 drag=false; 53 MovieClip(root).play(); 54 }
上面的代码就放在图层as中,剩下的两个图层不用我废话了~~
(3)你可能已经发现了,在(2)中的代码里面出现了两个未定义的变量currentFm和totalFm。没错,在这里(“进度控
制”影片剪辑)我们确实没有定义!但是,这并不能说明我们在整个fla文件中都没有定义,现在我就要告诉你它们是在
哪里被定义的,这也是为什么我们使用了root["变量名"]这么怪异的变量调用。
回到主场景中,打开动作面板,里面有这些代码
var totalFm:Number=totalFrames; var currentFm:Number; addEventListener(Event.ENTER_FRAME,reflash); function reflash(e:Event):void{ currentFm=currentFrame; }
明白了吧!!root["变量名"]是用来得到主场景中的变量值的,因为我们并不能在影片剪辑中直接使用本元件之外定义的
变量,否则,就会报错。但愿还有其他办法,但是目前我只知道这一种,而且是在尝试了N多失败例子之后才找到的。

浙公网安备 33010602011771号