主题:  xml mp3player

s22

职务:版主
等级:4
金币:10.0
发贴:1634
#12003/1/10 15:56:22

================================
给一家杂志的,他们把我的教程分了家。呵呵~现在发全了大家没买的也看看吧
希望能转到首页去。国内类似的教程不是太多。
杂志上的署名是5D !theOne
源文件以及DOC文件可以下载。

================================
这篇教程通过一个FLASH MP3播放器来给大家讲解XML同FLASH相结合的知识;这篇
不需要太多的XML知识,需要一些Actionscript知识。希望通过学习这篇教程,大家能认识XML,可以使用XML快速的建立动态应用程序。
原文件下载:http://www.unanhui.com/
关于Xml
Extensible Markup Language(可扩展标记语言),又简称为 XML,是针对网络应用的一项新技术。
XML 是 World Wide Web Consortium(W3C) 的一个标准,它允许您定制您自己的标记。
利用XML能够更容易的进行数据交换。
看下面这段XML:


boy
12



在浏览器里显示如下图:

可以发现我们能够很容易的理解数据间的关系,一个班级里有两个学生,一个学生叫JIM,是个男孩子,12岁了。另外一个学生叫LILY.
我们可以在这个班级里面继续的添加学生。学生的数量没有限制。
对于XML,我们只需要很简单的一些知识,知道一个XML文件由根节点和子节点(或多级子节点)构成。

关于XML的更多详细信息请参考和http://www.w3c.org上的相关部分

FLASH的中应用XML;
System.usecodepage=true;
FLASH MX系统开始全面支持unicode编码格式,由于我们使用中文操作系统,我们保存文件的时候,如果没有自己选择,系统默认的存储方式是ANSI编码格式,通过使用System.useCodePage=true;可以使flash认识本系统默认的编码格式。
当然,我们也可以通过在保存文件的时候选择Unicode格式的文件而避免使用这句代码。
有关Unicode格式的信息可以在Macromedia.com搜索。

在FLASH中我们操作XML是通过XML对象来实现的所以我们先建立一个xml对象
my_xml=new xml();
使用XML对象的load方法加载外部XML文件。
my_xml.load("playList.xml");

my_xml.ignoreWhite=true;
ignoreWhite方法是忽略XML文件中的空白部分。这个方法对于我们使用了排版格式编写的XML是必须的,因为如果使用了排版格式,如我们一开始写出的那个班级的例子,每个节点都有空格存在,如果不忽略这些因强制回车而造成的空格,FLASH会将这些空格分析成为一个子节点,这对于我们分析XML很不利。
编写播放列表
如下:





建立需要的元素

如图:我们需要建立三个文本框
属性设置如下:

var变量分别设置为:album 、name、artist;
人头部分是缺省的图片显示MC,可以随便做。命名为temp_mc便可。
音量滑动杆是使用flash公用库里的按钮部分里的现成MC(Knobs & Faders目录fader - gain),在它的第一帧代码的最后部分
sound.setVolume(level); 更改为_root.my_sound.setVolume(level);就可以了。
头像下的Display_mc,用来显示音乐的播放进度。也是嵌套的MC。
最后是控制按钮,分别为向前一曲,播放、下一曲、停止。

开始编写代码:

system.usecodepage=true;
使用系统默认编码格式
//===========================
my_xml=new xml();
my_xml.ignoreWhite=true;
my_xml.load("playList.xml");
//当xml加载的时候处理
my_xml.onLoad=function (s) {
    if(s){
//得到根节点
        rootNode=my_xml.firstChild;
//得到第一个子节点
        currentNode=rootNode.firstChild;
//计算节点个数,即歌曲数目
        nodeLength=rootNode.childNodes.length;
//当前序号
        currentNum=1;
//取得属性
        getAtt(currentNode)
        }
}
//取得属性
getAtt=function (node) {
//取得名称
name=node.attributes.name;
//取得歌手名称
         artist=node.attributes.artist;
//取得专辑名称
         album=node.attributes.album;
//取得文件名
         file=node.attributes.file;
//取得JPG文件名称
         jpgFile=node.attributes.jpgFile;
}
//计算下一个节点
nextNode=function () {
//如果当前节点有同级的下一个节点
    if(currentNode.nextSibling!=null){
//当前节点改为下一个
        currentNode=currentNode.nextSibling;

//取得当前节点的属性
        getAtt(currentNode)
//序号加1
        currentNum++;
        }
}
//更改当前节点为上一个节点,并取得属性,参看NextNode函数
preNode=function () {
    if(currentNode.previousSibling!=null){
        currentNode=currentNode.previousSibling;
        getAtt(currentNode)
        currentNum--;
        }
}
//加载图片并且更改为temp_mc的大小。
loadJpg = function () {
//判断是不是为当前歌曲设置了图片
    if (_root.jpgFile != null) {
//隐藏缺省图片
        temp_mc._visible = 0;
//建立加载图片的mc
        _root.createEmptyMovieClip("Jpg_mc", 1);
//加载图片文件
        _root.jpg_mc.loadMovie(_root.jpgFile);
//放置到缺省位置
        _root.jpg_mc._x = temp_mc._x;
        _root.jpg_mc._y = temp_mc._y;
//用OnEnterFrame事件判断是否已经加载完毕,如果加载完毕JPG_MC的宽度不
//为0;
        onEnterFrame = function () {
if (_root.jpg_mc._x != 0) {
//将图片更改高宽为需要的大小
_root.jpg_mc._width = temp_mc._width;
_root.jpg_mc._height = temp_mc._height;
}};
    } else {
//如果没有设置JpgFile那么显示缺省的图片;
        temp_mc._visible = 1;
        _root.jpg_mc.unloadMovie();
    }
};
//=========
//声音部分
//建立对象
my_sound=new sound();
//下面四个函数我们需要的四个按钮控制函数。
//播放声音
playSound=function () {
//定义一个_root.isplaying来确定当前是否有歌曲播放,如果没有便播放。
    if(!_root.isplaying){
//加载系统中的默认歌曲。
    my_sound.loadSound(_root.file);
//开始播放
    my_sound.start();
//停止playSound功能
    _root.isplaying=true;
    }
}
//停止声音
stopSound=function () {
//如果有歌曲播放就停止声音
    if(_root.isplaying){
        my_sound.stop();
_root.isplaying=false;
        }
}
//播放上一首歌
preSound=function () {
//转换上一节点为当前节点并分析变量
    preNode();
//停止当前在播放的文件
stopSound();
//播放声音
playSound();
}
//参考preSound
nextSound=function () {
    nextNode();
stopSound();
playSound();
}
//==========btn
//四个按钮对应我们编写的四个函数。
play_btn.onRelease=playSound;
stop_btn.onRelease=stopSound;
pre_btn.onRelease=preSound;
next_btn.onRelease=nextSound;
//下面是用来控制Display_mc显示声音播放的进度
_root.onEnterFrame=function () {
// 得到声音共多少秒
    var a=my_sound.duration/1000;
//已经播放多少秒
    var b=my_sound.position/1000;
//显示进度。
    _root.disPlay_mc.tmp_mc._width=(b/a)*100
}

也许大家觉得看代码太长了,其实看着注释,慢慢看下来你会发现其实代码也很简单。
好啦,如果有不懂的地方可以给我写信,Actionscripts@hotmail.com

相关文件:点这儿打开
相关文件:点这儿打开



janlay

职务:管理员
等级:7
金币:28.0
发贴:7244
#22003/1/10 15:57:26
不错,置顶!



UndeadCraft

职务:版主
等级:4
金币:10.0
发贴:1993
#32003/1/10 17:13:58
文件名还是问题。如果能像WINAMP一样选择MP3来放就好了。
这个感觉和原来的没什么两样。还是要改XML文件里的名字才行



s22

职务:版主
等级:4
金币:10.0
发贴:1634
#42003/1/10 19:08:03
如果用一些无聊的东西来学习xml我感觉没有意思。这是原因一
另外一个就是 这个用于服务器上可以使用后台来生成XML文件
不是为了使用而写。如果大家有兴趣,我过完年后考虑改编成exe
WINAMP方式。



平凡人

职务:普通成员
等级:4
金币:17.0
发贴:1442
#52003/1/10 20:00:34
楼上能说一下怎么用后台来生成XML吗



s22

职务:版主
等级:4
金币:10.0
发贴:1634
#62003/1/10 20:05:32
比如我用coldfusion后台
我查询数据库先
然后用标签输出内容就可以。而且不一定需要保存。
每次调用.CFM结尾的文件就可以。



平凡人

职务:普通成员
等级:4
金币:17.0
发贴:1442
#72003/1/10 20:28:15
s22能否在写一份后台的教程呀。最近一直在学这个,太没什么进展。



s22

职务:版主
等级:4
金币:10.0
发贴:1634
#82003/1/10 20:48:09
我也是新学后台。
不叫教程,准备写个通俗点的CF笔记。不过年前是没有时间啦~



手工感情

职务:普通成员
等级:3
金币:10.0
发贴:556
#92003/1/12 12:02:16
或许能够通过后台获取此目录下的文件结构。
然后自动生成XML文件。
只是……中文歌名就很麻烦。


黑色的风略过我的翅膀,我却无法落下来梳理你的羽毛
————————————————
◆5d.cn互动论坛◆
------|xml版主|------

Aw3000

职务:普通成员
等级:1
金币:0.0
发贴:79
#102003/1/13 15:30:09
好。能不能动态的调用磁碟上mp3 ?



蓝调

职务:普通成员
等级:1
金币:0.0
发贴:7
#112003/1/14 10:33:33
这只是基于本地的?如果我想通过网络呢?



蓝调

职务:普通成员
等级:1
金币:0.0
发贴:7
#122003/1/14 10:35:41
在音乐的控制方面还要加强,当播放结束后,再点播放就放不出来了。



轩飞

职务:普通成员
等级:1
金币:0.0
发贴:46
#132003/1/27 21:03:40
真是受益菲浅,最近我也在研究将XML作为Flash和ASP或PHP后台交互的中间层来加强flash网站的应用性的问题,希望有机会多交流。



金山羊

职务:普通成员
等级:4
金币:10.0
发贴:827
#142003/1/27 21:14:46
如果用cf或jsp等服务器就不用xml了
尤其是cf可以直接返回文件列表而返回给flash得recordset对象


5d.cn
FLASHDEP
TECHNOLOGY SUPPORT
JAVA/ACTIONSCRIPT/javascript
CFML/JSP/COLDFUSION/FLASH REMOTING
JRUN/COLDFUSIONMX
FLASH/DREAMWEARER