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多失败例子之后才找到的。

 

 

posted @ 2013-10-10 21:26  Zimin  阅读(1390)  评论(0)    收藏  举报