Flash教程:个性播放器的制作

来源:百度文库 编辑:神马文学网 时间:2024/04/26 21:38:47

Flash教程:个性播放器的制作

这个播放器只能播放与该swf文件相同目录下的文件,

因此在这里只能看到效果,不能加载文件。

要测试这个播放器,

请将这个swf与要播放的文件放到相同的目录中。

先看看效果:

这是一款播放器,

它可以播放你硬盘上与该swf文件相同目录下的swf动画和mp3音乐文件,

也可以用着图片浏览器。

这款播放器的特点是,它本身并不包含任何影音及图片文件,

而是动态地加载电脑硬盘上的文件。

因此,通过本例,

我们主要可以练习动态加载外部文件及其控制的方法。
 那么怎样打开外部文件呢?我们在用其它软件时,

点击“打开”,都会弹出一个“打开”对话框,

那么在flash中是否也可以作这样一个对话框呢?非常幸运,

flash为我们提供了一个被称作FileReference的类实现了了这个功能。
 有了FileReference类,使得我们可以尝试制作这样一款播放器,

好吧,现在我们就动手来实现它。
 我们首先把外形建起来吧。

新建一flash文档,在第一层按下图绘制一个框架:
 

创建如下图所示四个按钮: 

按下图提示制作: 

新建一层,将新制作的四个按钮元件按下图,

放好:
 

再建如下图所示5个按钮,制作方法与上面的四个一样,

然后按上图,放好。
 

还有其它的文字,点缀啊也都放到这一层,按上图做就行了。

再建两个影片剪辑,

注意这两个影片剪辑的注册点一定要放在左上角,

这非常重要。如下图:
   然后将刚建的两个影片剪辑

分别命名为:yl2、yl1,如图:
 

接下来,新建一图层:

然后画一矩形,如图:
 

点击“修改”-“转换为元件”,将矩形转换为,影片剪辑。

并在属性面板中,将该影片剪辑命名为:pm.
 新建一图层,画一个与刚才画的矩形大小位置相同的矩形。

然后在该层上点右键,-“遮罩”。
 新建一图层,点击“文本”工具,

画一个与上面矩形相同大小位置的文本框。

在属性面板中,设置如下:动态文本,命名为:mp3_txt,多行,

使用设备字体。设置好文字大小和字体,

这个文本框是用来显示mp3的标签信息的,如歌曲名称,演唱者等。

设置如下图:
 

好,到现在为止,外观完成,接下来的事就是写代码了。

下面的代码介绍可能会有点乱,没关系,

在最后我会将代码集中提供出来的,如果你只想复制代码,

可以跳过这一段(黑体字部分)。
 现在开始写代码,上面我们提到,

FileReference类为我们提供了一个象windows打开窗口一样的对话框,

那么要用这个类,我们就首先要引入这个类:
 新建一图层,取名为action,在第一帧,点右键,点“动作”,

在动作窗口中输入:

import flash.net.FileReference;

  
先介绍一下FileReference,这个类,

可以为我们打开象windows打开窗口一样的对话框,

如图:
 

 通过上面一句代码引入该类后,就可以使用它了。

我们用它打开“打开”窗口,(有点咬口),

要用到该类的browse方法,语法如下:

var fileRef:FileReference = new FileReference();
fileRef.browse(fltype);

这里我们注意到,browse()中带了一个参数:

fltype,这个参数是指打开的文件类型。

它是一个数组,它的格式为:

fltype = [{description:"swf文件",extension: "*.swf"}];

这是以打开swf文件为例的,这样在打开窗口中,

则只会出现swf文件,要打开其它文件,参照此例。

FileReference类还有一事件我们要用到,onSelect,如上图,

在我们选择一个文件,然后点击“打开”时发生。

FileReference的name属性,一个重要的属性,

它将返回我们选中的文件的名称,其实这才是我们要的东西。

好了。FileReference应用的完整代码如下:

import flash.net.FileReference;

var fltype:Array = new Array();

var flname:String ;

fltype = [{description:"swf文件",extension: "*.swf"}];

 var listener:Object = new Object();

listener.onSelect = function(file:FileReference):Void {

flname = file.name;

}

var fileRef:FileReference = new FileReference();

fileRef.addListener(listener);

fileRef.browse(fltype);

实际这一段,

我们得到的就是一个我们选择的文件名称:flname.

在了解了FileReference以后,我们就可以来编写代码了。

刚才我们已经在action层上写了一句:

import flash.net.FileReference; 了。

接下来是:

var fltype:Array = new Array();

var flname:String ;

var i;

这两句声明了文件类型的数组变量和文件名变量,后面要用的。

还声明了一个变量i,后面也会用到。

好,首先我们来加载swf文件,我们把代码写到,“swf文件“按钮上,

点击”swf文件“按钮,打开动作面板,

写下如下代码:

on(release) {
        
       
 _root.i = 1;
       
 _root.fltype = [{description:"swf文件",extension: "*.swf"}];
       
 var listener:Object = new Object();

listener.onSelect = function(file:FileReference):Void {

_root.flname = file.name;

        
_root.pm.loadMovie(_root.flname);
        
_root.pm._x = 105;
       
 _root.pm._y = 63;
        
_root.pm._xscale = 75;
       
 _root.pm._yscale = 70;
        
}

var fileRef:FileReference = new FileReference();

fileRef.addListener(listener);

fileRef.browse(fltype);

_root.fd_bt._visible = false;

_root.mp3_txt._visible = false;

}

on(rollOver) {
        
var bsy:Sound = new Sound();
        
bsy.attachSound("bs");
        
bsy.start();

}

on(press) {
        
var bsy:Sound = new Sound();
        
bsy.attachSound("cs");
        
bsy.start();

}
        
我们来解释一下,这些代码,第一句_root.i = 1;

就是设置在时间轴第一帧声明的变量i第于1,

它的作用就是告诉程序,现在点了”swf文件“按钮。

接下来几句,调用了FileReference类,取得了文件名。

有了文件名就好办了,用.loadMovie加载这个文件,

并设置相关属性。这些属性就是控制加载的文件的大小各位置。

接下来是,鼠标移过各点击按钮时,要加载的声音。

通过这个按钮上代码,我们已经加载了一个swf文件到场景的pm元件上。

接下来就是控制已加载的文件了。

看看下面几个按钮,它们就是用来控制加载的文件的。

先打开播放按钮,在动作面板中输入如下代码:

on(release) {
        
if (_root.i=1) {
        
_root.pm.play();
        
}

看到i的作用了吧,假如i=1(假如点的是“swf文件“按钮),

加载的文件开始播放。

然后是暂停按钮,代码这样写:

on(release) {
        
if (_root.i=1) {
        
_root.pm.stop();
        
}

快退按钮:

on(release){
        
if (i=1){
               
var kj = _root.pm._currentframe + 10;
               
_root.pm.gotoAndStop(kj);
        
}

停止按钮:

on(release) {
        
if (_root.i=1) {
        
_root.pm.gotoAndStop(1);
       
 }

快进按钮:

on(release){
       
 if (i=1){
               
var kt = _root.pm._currentframe - 10;
               
_root.pm.gotoAndStop(kt);
        
}

加载swf文件就做完了,接下来是,加载图片文件,

点击“图片文件”按钮,打开动作面板,输入:

on(release){

import flash.net.FileReference;
       
 _root.i = 2;
        
_root.fltype = [{description:"图片文件",extension: "*.jpg;*.bmp;*.gif"}];
       
 var listener:Object = new Object();

listener.onSelect = function(file:FileReference):Void {

_root.flname = file.name;

 _root.pm.loadMovie(_root.flname);
        
_root.pm._x = 105;
       
 _root.pm._y = 63;
        
_root.pm._xscale = 20;
        
_root.pm._yscale = 20;

}

var fileRef:FileReference = new FileReference();

fileRef.addListener(listener);

fileRef.browse(fltype);

_root.fd_bt._visible = true;

_root.mp3_txt._visible = false;

}

on(rollOver) {
        
var bsy:Sound = new Sound();
        
bsy.attachSound("bs");
        
bsy.start();

}

on(press) {
        
var bsy:Sound = new Sound();
        
bsy.attachSound("cs");
        
bsy.start();

}

这段代码跟加载swf文件基本一样,不同的是,第4行:

_root.fltype = [{description:"图片文件",extension: "*.jpg;*.bmp;*.gif"}];

这里,我们奖文件类型数组,设为了,可打开jpg,bmp,gif,等,

好可以打开png格式的图片,你可在上面大括号中加上,.png就行了。

另外图片加载的大小被疫为原图的20%.不过后有一句:

_root.fd_bt._visible = true; “放大图片”按钮可见,这个按钮,

可将图片放大到与pm元件一样大小。

点击“放大图片”按钮,输入:

on(release){

_root.pm._width = 413;

_root.pm._height = 277;

}

接下来是“mp3文件“,按钮:

on(release){
        
_root.mp3_txt._visible = true;
        
_root.ztd = 0;

import flash.net.FileReference;
        
_root.i = 3;
        
_root.fltype = [{description:"mp3文件",extension: "*.mp3"}];
        
var listener:Object = new Object();

listener.onSelect = function(file:FileReference):Void {

_root.flname = file.name;
        
_root.mymp3.stop();

_root.mymp3.onLoad = function(success:Boolean):Void {
   
if (success) {
               
_root.mp3_txt.text = _root.flname;
       
 var cq:String=_root.ANSI2UTF(_root.mymp3.id3.TOLY);
     
var songname:String=_root.ANSI2UTF(_root.mymp3.id3.songname);  
         
var ycz:String=_root.ANSI2UTF(_root.mymp3.id3.TPE1); 
                  
_root.mp3_txt.text =_root.mp3_txt.text + "\n" + "歌曲名称:" + songname;
        
_root.mp3_txt.text =_root.mp3_txt.text + "\n" + "词曲:" + cq;
         
_root.mp3_txt.text =_root.mp3_txt.text + "\n" + "演唱者:" + ycz;

};

}

_root.mymp3.loadSound(_root.flname, false);

}

var fileRef:FileReference = new FileReference();

fileRef.addListener(listener);

fileRef.browse(fltype);

_root.fd_bt._visible = false;

unloadMovie(_root.pm);

}

第一句:让mp3标签,可见,该文本框将显示歌曲名称,演唱者等信息。

第二句:是让一个变量ztd等于0,这个变量记录了,歌曲播放时,

点击暂停按钮后,歌曲暂停的位置。现在刚加载歌曲,

暂停点当然为零。接下来是弹出“打开”窗口的命令,跟上面的一样。

在获得文件名后。对于mp3文件,就要用这样的命令成功加载国:

var mymp3:Sound = new Sound(); //这一句我把它放到帧上了,

也可以放到这里。

_root.mymp3.loadSound(_root.flname, false);

在mp3文件包含着一些相关信息,

我们可以用Sound的id3属性将它们提取出来显示在文本标签中,

比如歌曲名称,演唱者,发行年份等等。如:

Sound.id3.TIT2 是歌曲名称,Sound.id3.TPE1是演唱者等。

当我将这些信息显示在文本框中时,发现全部是乱码,

于是我在网上找到了一个解决办法来转换编码,这些办法我也不懂,

但我知道怎样用,要声明一个函数ANSI2UTF,

然后用这个函数来转换,所以我在时间轴上声明了这个函数,

我是照搬的:

function ANSI2UTF(ANSI_string) {

var temp = !(!System.useCodepage);

System.useCodepage = true;

var code = "";

for (var i = 0; i   
code += "%"+ANSI_string.charCodeAt(i).toString(16);

}

var result = unescape(code);

System.useCodepage = temp;

return result;

}

这样我们在这里要取得mp3标签中的信息就可以用这个函数不转换:

var songname:String=_root.ANSI2UTF(_root.mymp3.id3.songname);

经测试现在能正常显试了。

同样的,在加载了mp3文件后,我们仍要用几个按钮来控制它,

还是播放,暂停……等那几个按钮:

在播放按钮的on(release){}中加:

if (_root.i=3){
        
_root.mymp3.start(ztd); 
   
}

这是从暂停点开始播放加载的mp3文件。

在暂停按钮中,加:

if (_root.i = 3){
               
_root.ztd = _root.mymp3.position/1000;
               
_root.mymp3.stop();
        
}

i=3是说现在按了“mp3文件“按钮。

Sound对象的position属性记录了,停止播放声音的那一点,

以毫秒为单位。

Sound的setVolume方法,可以为声音设置音量。

音量控制的代码我们放在yl1原件上。
 下面我们接着来制作:接到上面的,当我们将外观完成后,

新建一图层,取名为:action,然后打开动作面板,

输入如下代码:

import flash.net.FileReference;

var fltype:Array = new Array();

var flname:String ;

var i = 1;

var yl;

var ztd = 0;

fd_bt._visible = false;

var mymp3:Sound = new Sound();

function ANSI2UTF(ANSI_string) {

var temp = !(!System.useCodepage);

System.useCodepage = true;

var code = "";

for (var i = 0; i
code += "%"+ANSI_string.charCodeAt(i).toString(16);

}

var result = unescape(code);

System.useCodepage = temp;

return result;

}

var yly = yl1._y;

yl1.onMouseMove = function (){

if (this._x < yl2._x ) {

this._x = yl2._x;

this.stopDrag();

}

if (this._x > yl2._x + 185) {

this._x =

yl2._x + 180 ;

this.stopDrag();

}

if (this._y <> yly ) {

this._y = yly;
              

}

_root.yl = ((_root.yl1._x - _root.yl2._x)/_root.yl2._width)*100;

_root.mymp3.setVolume(_root.yl);

}

点击“swf文件”按钮,在动作面板中输入:

on(release) {
      

_root.i = 1;

_root.fltype = [{description:"swf文件",extension: "*.swf"}];

var listener:Object = new Object();

listener.onSelect = function(file:FileReference):Void {

_root.flname = file.name;

_root.pm.loadMovie(_root.flname);

_root.pm._x = 105;

_root.pm._y = 63;

_root.pm._xscale = 75;

_root.pm._yscale = 70;
      
}

var fileRef:FileReference = new FileReference();

fileRef.addListener(listener);

fileRef.browse(fltype);

_root.fd_bt._visible = false;

_root.mp3_txt._visible = false;

}

on(rollOver) {

var bsy:Sound = new Sound();

bsy.attachSound("bs");

bsy.start();

}

on(press) {

var bsy:Sound = new Sound();

bsy.attachSound("cs");

bsy.start();

}
      
“图片文件”按钮中的代码:

on(release){

import flash.net.FileReference;

_root.i = 2;

_root.fltype = [{description:"图片文件",extension: "*.jpg;*.bmp;*.gif"}];

var listener:Object = new Object();

listener.onSelect = function(file:FileReference):Void {

_root.flname = file.name;

_root.pm.loadMovie(_root.flname);

_root.pm._x = 105;

_root.pm._y = 63;
      

_root.pm._xscale = 20;

_root.pm._yscale = 20;
}

var fileRef:FileReference = new FileReference();

fileRef.addListener(listener);

fileRef.browse(fltype);

_root.fd_bt._visible = true;

_root.mp3_txt._visible = false;

}

on(rollOver) {

var bsy:Sound = new Sound();

bsy.attachSound("bs");

bsy.start();

}

on(press) {

var bsy:Sound = new Sound();

bsy.attachSound("cs");

bsy.start();

}

“mp3文件”中的代码“

on(release){

_root.mp3_txt._visible = true;

_root.ztd = 0;

import flash.net.FileReference;

_root.i = 3;

_root.fltype = [{description:"mp3文件",extension: "*.mp3"}];

var listener:Object = new Object();

listener.onSelect = function(file:FileReference):Void {

_root.flname = file.name;
      
_root.mymp3.stop();

_root.mymp3.onLoad = function(success:Boolean):Void {

if (success) {

_root.mp3_txt.text = _root.flname;

var cq:String=_root.ANSI2UTF(_root.mymp3.id3.TOLY);

var songname:String=_root.ANSI2UTF(_root.mymp3.id3.songname);

var ycz:String=_root.ANSI2UTF(_root.mymp3.id3.TPE1);

_root.mp3_txt.text =_root.mp3_txt.text + "\n" + "歌曲名称:" + songname;

_root.mp3_txt.text =_root.mp3_txt.text + "\n" + "词曲:" + cq;

_root.mp3_txt.text =_root.mp3_txt.text + "\n" + "演唱者:" + ycz;

};

}

_root.mymp3.loadSound(_root.flname, false);

}

var fileRef:FileReference = new FileReference();

fileRef.addListener(listener);

fileRef.browse(fltype);

_root.fd_bt._visible = false;

unloadMovie(_root.pm);

}

on(rollOver) {

var bsy:Sound = new Sound();

bsy.attachSound("bs");

bsy.start();

}

on(press) {

var bsy:Sound = new Sound();

bsy.attachSound("cs");

bsy.start();

}

“放大图片”按钮上的代码:

on(release){

_root.pm._width = 413;

_root.pm._height = 277;

}

on(rollOver) {

var bsy:Sound = new Sound();

bsy.attachSound("bs");

bsy.start();

}

on(press) {

var bsy:Sound = new Sound();

bsy.attachSound("cs");

bsy.start();

}

播放按钮上的代码:

on(release) {

if (_root.i=1) {

_root.pm.play();

}

if (_root.i=3){

_root.mymp3.start(ztd);

}

}

暂停按钮上的代码:

on(release) {

if (_root.i=1) {

_root.pm.stop();

}

if (_root.i = 3){

_root.ztd = _root.mymp3.position/1000;

_root.mymp3.stop();

}

}

快退按钮上的代码:

on(release){

if (i=1){

var kj = _root.pm._currentframe + 10;

_root.pm.gotoAndStop(kj);

}

if (_root.i = 3) {
              
_root.ztd =

(_root.mymp3.position - 5000)/1000;

_root.mymp3.stop();
              
_root.mymp3.start(_root.ztd);

}

}

停止按钮上的代码:

on(release) {

if (_root.i=1) {

_root.pm.gotoAndStop(1);

}

if (_root.i=3){
      
_root.ztd = 0;

_root.mymp3.stop();

}

}

快进按钮上的代码:

on(release){

if (i=1){

var kt = _root.pm._currentframe - 10;

_root.pm.gotoAndStop(kt);

}

if (_root.i = 3) {
              
_root.ztd =

(_root.mymp3.position + 5000)/1000;

_root.mymp3.stop();
              

_root.mymp3.start(_root.ztd);

}
              
}

在yl1元件上的代码:

on(press) {

this.startDrag();
      
}

on(release) {

this.stopDrag();

_root.yl = ((_root.yl1._x - _root.yl2._x)/_root.yl2._width)*100;

_root.mymp3.setVolume(_root.yl);
      
      
}

on(rollOut){

this.stopDrag();
      
}