Flash游戏、Flash音乐、小游戏

加入收藏

设为主页

首页 | Flash游戏 | Flash音乐 | Flash动画 | 邻家女孩 | 动漫下载 | 小说 | 动漫资讯 | 免费博客

Flash游戏 | 动漫COSPLAY | 手机世界 | 游戏新闻 | IT业界 | 动漫设计 | 软硬件交流

首页>>动漫设计>>正文用as2.0写导航菜单

将woogood加入收藏夹 | 将woogood设置成为你电脑首页

搜索 SEARCH

    

用as2.0写导航菜单

作者:[] 来源:[] [2005-10-6 17:13:45] [对"用as2.0写导航菜单"发表评论]

最新文章

·隐藏卸载信息:跟入侵者玩躲猫猫
·网络新威胁 无线局域网入侵检测现
·宽带用户易被攻击 用户需注意七大
·如何查找和清除线程插入式木马程
·日志分析两部曲:充分利用日志保
·安全设置Windows组策略 有效阻止
·实现了!中文WinXP安装IE7 Beta1
·黑客破解Email账号常用的三种方法
·基础知识 XST攻击理论及手法讲解
·威胁同样巨大 基于Telnet协议的攻

推荐文章

·请教看电影多的人问题
·文字处理软件疑难问题求助,
·求助:Excel问题
·在线等...........
·大家都是怎样用摄像头的?发
·如何加启动程序?急
·midia player classic使用时
·关于IE,请大家帮助
·IE被改用兔子也没用啊??
·播放器问题,大家帮帮忙啊

  介绍:95%以上用脚本实现,直接修改XML文件就可以改变菜单内容。
这个是教程
http://public.iecn.net/freebrandy/menu/myMenuBar.html
这个是成品(当然大家可以改得更好了)
http://public.iecn.net/freebrandy/menu/myMenuBar.htm
演示效果:http://public.iecn.net/freebrandy/menu/myMenuBar.htm

说明:
这是用AS2.0类(FlashMX专业版2004)写的一个动态菜单。菜单的标题及链接用XML文件贮存,SWF文件导入XML文件后进行XML分析,
把数据存入数组中,再根据数组的内容动态建立主菜单及各子菜单,可在源文件中设置子菜单的排列方式,如示例所示。
另外,针对lable文字不可能通过脚本来进行美化的问题,可以加上动态载入图片代替原背景图片功能,图片的位置也放在XML文件中,
在建立菜单时动态导入。
大家可以把SWF文件和menuData.xml下载后测试,要注意menuData.xml文件是UTF-8码格式的,可以改动,但要保证格式符合规律(有子
菜单的一定没有url,反之则有)。
menuData.xml(贮存菜单数据的XML文件)
<?xml version="1.0" encoding="utf-8" ?>
<mymenu>
 <mainmenu url="1.asp" lable="1">
 </mainmenu>
 <mainmenu lable="2">
  <submenu url="2.1.asp" lable="2.1" />
  <submenu url="2.2.asp" lable="2.2" />
  <submenu url="2.3.asp" lable="2.3" />
  <submenu url="2.4.asp" lable="2.4" />
 </mainmenu>
 <mainmenu lable="3">
  <submenu url="3.1.asp" lable="3.1" />
  <submenu url="3.2.asp" lable="3.2" />
  <submenu url="3.3.asp" lable="3.3" />
 </mainmenu>
 <mainmenu lable="4">
  <submenu url="4.1.asp" lable="4.1" />
  <submenu url="4.2.asp" lable="4.2" />
  <submenu url="4.3.asp" lable="4.3" />
  <submenu url="4.4.asp" lable="4.4" />
 </mainmenu>
 <mainmenu lable="5">
  <submenu url="5.1.asp" lable="5.1" />
  <submenu url="5.2.asp" lable="5.2" />
  <submenu url="5.3.asp" lable="5.3" />
  <submenu url="5.4.asp" lable="5.4" />
  <submenu url="5.5.asp" lable="5.5" />
 </mainmenu>
 <mainmenu lable="6">
  <submenu url="6.1.asp" lable="6.1" />
  <submenu url="6.2.asp" lable="6.2" />
  <submenu url="6.3.asp" lable="6.3" />
 </mainmenu>
 <mainmenu lable="7">
  <submenu url="7.1.asp" lable="7.1" />
  <submenu url="7.2.asp" lable="7.2" />
 </mainmenu>
</mymenu>

MenuXMLModel.as(进行XML文件分析的as2.0类)

import mx.events.EventDispatcher;
class MenuXMLModel extends XML {
 private var mainmenu:Array;
 private var submenu:Array;
 public var addEventListener:Function;
 public var removeEventListener:Function;
 private var dispatchEvent:Function;
 private static var _mixin1 = EventDispatcher.initialize(MenuXMLModel.prototype);
 
 public function MenuXMLModel() {
  mainmenu = new Array();
  submenu = new Array();
  ignoreWhite = true;
 }
 private function onLoad():Void {
  var tempA = new Array();
  var tempB = new Array();
  tempA = this.firstChild.childNodes;
  for (var i=0; i<tempA.length; i++){
   mainmenu[i]=[tempA[i].attributes.lable,tempA[i].attributes.url];
   tempB = tempA[i].childNodes;
   var tempC = new Array();
   for (var j=0; j<tempB.length; j++){
    tempC[j]=[tempB[j].attributes.lable,tempB[j].attributes.url];
   }
   submenu[i]=tempC;
   delete tempC;
  }
  this.dispatchEvent({type:"onMenuDataLoaded", target:this});
 }
 public function getMainMenuArray():Array {
  return mainmenu;
 }
 public function getSubMenuArray():Array {
  return submenu;
 }
}

MenuView.as(as2.0类,用于设置单个菜单项目的属性)

class MenuView extends MovieClip {
 
 private var _menuLable;
 private var _menuUrl;
 private var _sn;
 
 private function MenuView() {
 }
 
 public function set menuLable(i:String):Void {
  _menuLable.text = i;
 }
 public function set menuUrl(i:String):Void {
  _menuUrl = i;
 }
 public function set sn(i:Number):Void {
  _sn = i;
 } 
 public function get menuUrl():String {
  return _menuUrl;
 }
 public function get menuLable():String {
  return _menuLable.text;
 }
 public function get sn():Number {
  return _sn;
 }
}

MenuPresenter.as(表示器,用来组织如何显示菜单的as2.0类)

import MenuXMLModel;
class MenuPresenter extends MovieClip {
 
 private var _totalMenuItem:Number;
 private var _menu_xml:MenuXMLModel;
 private var mainMenuArray:Array;
 private var subMenuArray:Array;
 private var menuBarWidth:Number = Stage.width;
 private var menuBarHeigth:Number = 22;
 private var menuBarX:Number;
 private var menuBarY:Number;
 private var subMenuBarRow:Boolean = false;
 
 public function MenuPresenter() {
  _menu_xml = new MenuXMLModel();
  this.loadXML("menuData.xml");
 }
 
 private function onMenuDataLoaded():Void {
  //得到贮存菜单数据的数组及菜单数量
  mainMenuArray=_menu_xml.getMainMenuArray();
  subMenuArray =_menu_xml.getSubMenuArray();
  _totalMenuItem = mainMenuArray.length;
  
  //设定整个菜单的位置参数值
  menuBarX = 0;
  menuBarY = 0;
  //设定单个菜单的宽度
  var menuWidth:Number = menuBarWidth/_totalMenuItem;
  
  //一次性把主菜单及所有的下拉MC都建立,使用户访问更快
  //主菜单
  var menuBar:MovieClip;
  var menuItem:MovieClip;
  menuBar=this.createEmptyMovieClip("mainMenuBar",100);
  menuBar._x = menuBarX;
  menuBar._y = menuBarY;
  for (var i = 0; i<_totalMenuItem; i++) {
   menuItem = menuBar.attachMovie("MenuItem", "MenuItem_"+i, 100+i);
   menuItem._width = menuWidth;
   menuItem._x = menuWidth/2 + i*menuWidth;
   menuItem.menuLable = mainMenuArray[i][0];
   //根据是否存在下拉菜单进行设置
   if (mainMenuArray[i][1]==undefined) {
    menuItem.sn=i;
    menuItem.onRollOver=function(){
     var owner:Object = this._parent._parent;
     owner.showSubMenu(this.sn);
    }
    menuItem.onPress=function(){
     //这里加上条件判断是对用户试探性点击做出的回应
     var owner:Object = this._parent._parent;
     var tempMC:MovieClip = eval(owner+"."+this.sn);
     if (tempMC._visible == true){
      owner.closeSubMenu(this.sn)
     }else{
      owner.showSubMenu(this.sn);
     }
    }
   }else{
    menuItem.menuUrl = mainMenuArray[i][1];
    menuItem.onPress=function(){
     //测试用
     _root.url.text=this.menuUrl+" will be loaded.";
     //getURL(this.menuUrl);
    }
   }
  }
  //建立各子菜单
  var subMenuBar:MovieClip;
  var subMenuItem:MovieClip;
  //子菜单的数量根据XML文件内容确定
  for (var i = 0; i<_totalMenuItem; i++){
   //对于只有一级菜单的不建立子菜单(主菜单有lable且有url说明没有下级菜单)
   if (mainMenuArray[i][1]!=undefined) continue; 
   
   //这是放置子菜单的MC(用i来设置新名称是为了方便控制,因为这个i也就是菜单对应数据在数组中的位置)
   //子菜单的位置应该由上级菜单位置确定,这样美观,但得根据数量动态设定,有一定难度
   subMenuBar = this.createEmptyMovieClip(i,i);
   subMenuBar._visible = false; 
   subMenuBar._x = menuBarX + i*menuWidth + menuWidth/2;
   subMenuBar._y = menuBarY + menuBarHeigth + 1;
   //每个子菜单里的MC
   var n:Number=0;
   for (var j=0; j<subMenuArray[i].length; j++){
    subMenuItem = subMenuBar.attachMovie("MenuItem", "subMenuItem_"+n, 100+n);
    //根据subMenuBarRow的真假来确定子菜单是横排还是竖排
    if (subMenuBarRow){
     subMenuItem._width = menuWidth;
     subMenuItem._x = j*menuWidth;
    }else{
     subMenuItem._width = menuWidth;
     //subMenuItem._x = menuWidth;
     subMenuItem._y = j*(menuBarHeigth+1);
    }
    subMenuItem.menuLable = subMenuArray[i][j][0];
    //下面是用hitTest来确定是否关闭子菜单,这是一个关键性技巧
    subMenuItem.onRollOut=function(){
     if (!this._parent.hitTest(_root._xmouse, _root._ymouse, false)){
      this._parent._visible = false;
     }    
    }
    subMenuItem.menuUrl = subMenuArray[i][j][1];
    subMenuItem.onPress=function(){
     //测试用
     _root.url.text=this.menuUrl+" will be loaded.";
     //getURL(this.menuUrl);
    }
    n++;
   }
  }
  
  delete mainMenuArray;
  delete subMenuArray;
  delete _menu_xml;
 }
 
 private function showSubMenu(i:Number):Void {
  for (var j=0; j<_totalMenuItem; j++){
   var tempMC:MovieClip = eval("this."+j);
   if (i!=j){
    tempMC._visible = false;
   }else{
    tempMC._visible = true;
   }
  }
 }
 private function closeSubMenu(i:Number):Void {
  var tempMC:MovieClip = eval("this."+i);
  tempMC._visible = false;
 }
 //给外界提供的导入XML文件方法  
 public function loadXML(xn:String):Void {
  _menu_xml.load(xn);
  _menu_xml.addEventListener("onMenuDataLoaded", this);
 }
 //给外界提供设置子菜单的排列方向的方法
 public function set Row(i:Boolean):Void {
  subMenuBarRow = i;
 }
}

/*
数组结构图
  |-0 [lable,url]
  |-1 [lable,url]
mainMenuArray  -|-2 [lable,url]
  |-3 [lable,url]
  |-4 [lable,url]
       |-0 [lable,url]
        |-1 [lable,url]
  |-0 -|-2 [lable,url]
  |-1  |-3 [lable,url]
subMenuArray   -|-2
  |-3  |-0 [lable,url]
  |-4 -|-1 [lable,url]
       |-2 [lable,url]
*/



 

import mx.events.EventDispatcher;
class MenuXMLModel extends XML {
 private var mainmenu:Array;
 private var submenu:Array;
 public var addEventListener:Function;
 public var removeEventListener:Function;
 private var dispatchEvent:Function;
 private static var _mixin1 = EventDispatcher.initialize(MenuXMLModel.prototype);
 
 public function MenuXMLModel() {
  mainmenu = new Array();
  submenu = new Array();
  ignoreWhite = true;
 }
 private function onLoad():Void {
  var tempA = new Array();
  var tempB = new Array();
  tempA = this.firstChild.childNodes;
  for (var i=0; i<tempA.length; i++){
   mainmenu[i]=[tempA[i].attributes.lable,tempA[i].attributes.url];
   tempB = tempA[i].childNodes;
   var tempC = new Array();
   for (var j=0; j<tempB.length; j++){
    tempC[j]=[tempB[j].attributes.lable,tempB[j].attributes.url];
   }
   submenu[i]=tempC;
   delete tempC;
  }
  this.dispatchEvent({type:"onMenuDataLoaded", target:this});
 }
 public function getMainMenuArray():Array {
  return mainmenu;
 }
 public function getSubMenuArray():Array {
  return submenu;
 }
}

MenuView.as(as2.0类,用于设置单个菜单项目的属性)

class MenuView extends MovieClip {
 
 private var _menuLable;
 private var _menuUrl;
 private var _sn;
 
 private function MenuView() {
 }
 
 public function set menuLable(i:String):Void {
  _menuLable.text = i;
 }
 public function set menuUrl(i:String):Void {
  _menuUrl = i;
 }
 public function set sn(i:Number):Void {
  _sn = i;
 } 
 public function get menuUrl():String {
  return _menuUrl;
 }
 public function get menuLable():String {
  return _menuLable.text;
 }
 public function get sn():Number {
  return _sn;
 }
}

MenuPresenter.as(表示器,用来组织如何显示菜单的as2.0类)

import MenuXMLModel;
class MenuPresenter extends MovieClip {
 
 private var _totalMenuItem:Number;
 private var _menu_xml:MenuXMLModel;
 private var mainMenuArray:Array;
 private var subMenuArray:Array;
 private var menuBarWidth:Number = Stage.width;
 private var menuBarHeigth:Number = 22;
 private var menuBarX:Number;
 private var menuBarY:Number;
 private var subMenuBarRow:Boolean = false;
 
 public function MenuPresenter() {
  _menu_xml = new MenuXMLModel();
  this.loadXML("menuData.xml");
 }
 
 private function onMenuDataLoaded():Void {
  //得到贮存菜单数据的数组及菜单数量
  mainMenuArray=_menu_xml.getMainMenuArray();
  subMenuArray =_menu_xml.getSubMenuArray();
  _totalMenuItem = mainMenuArray.length;
  
  //设定整个菜单的位置参数值
  menuBarX = 0;
  menuBarY = 0;
  //设定单个菜单的宽度
  var menuWidth:Number = menuBarWidth/_totalMenuItem;
  
  //一次性把主菜单及所有的下拉MC都建立,使用户访问更快
  //主菜单
  var menuBar:MovieClip;
  var menuItem:MovieClip;
  menuBar=this.createEmptyMovieClip("mainMenuBar",100);
  menuBar._x = menuBarX;
  menuBar._y = menuBarY;
  for (var i = 0; i<_totalMenuItem; i++) {
   menuItem = menuBar.attachMovie("MenuItem", "MenuItem_"+i, 100+i);
   menuItem._width = menuWidth;
   menuItem._x = menuWidth/2 + i*menuWidth;
   menuItem.menuLable = mainMenuArray[i][0];
   //根据是否存在下拉菜单进行设置
   if (mainMenuArray[i][1]==undefined) {
    menuItem.sn=i;
    menuItem.onRollOver=function(){
     var owner:Object = this._parent._parent;
     owner.showSubMenu(this.sn);
    }
    menuItem.onPress=function(){
     //这里加上条件判断是对用户试探性点击做出的回应
     var owner:Object = this._parent._parent;
     var tempMC:MovieClip = eval(owner+"."+this.sn);
     if (tempMC._visible == true){
      owner.closeSubMenu(this.sn)
     }else{
      owner.showSubMenu(this.sn);
     }
    }
   }else{
    menuItem.menuUrl = mainMenuArray[i][1];
    menuItem.onPress=function(){
     //测试用
     _root.url.text=this.menuUrl+" will be loaded.";
     //getURL(this.menuUrl);
    }
   }
  }
  //建立各子菜单
  var subMenuBar:MovieClip;
  var subMenuItem:MovieClip;
  //子菜单的数量根据XML文件内容确定
  for (var i = 0; i<_totalMenuItem; i++){
   //对于只有一级菜单的不建立子菜单(主菜单有lable且有url说明没有下级菜单)
   if (mainMenuArray[i][1]!=undefined) continue; 
   
   //这是放置子菜单的MC(用i来设置新名称是为了方便控制,因为这个i也就是菜单对应数据在数组中的位置)
   //子菜单的位置应该由上级菜单位置确定,这样美观,但得根据数量动态设定,有一定难度
   subMenuBar = this.createEmptyMovieClip(i,i);
   subMenuBar._visible = false; 
   subMenuBar._x = menuBarX + i*menuWidth + menuWidth/2;
   subMenuBar._y = menuBarY + menuBarHeigth + 1;
   //每个子菜单里的MC
   var n:Number=0;
   for (var j=0; j<subMenuArray[i].length; j++){
    subMenuItem = subMenuBar.attachMovie("MenuItem", "subMenuItem_"+n, 100+n);
    //根据subMenuBarRow的真假来确定子菜单是横排还是竖排
    if (subMenuBarRow){
     subMenuItem._width = menuWidth;
     subMenuItem._x = j*menuWidth;
    }else{
     subMenuItem._width = menuWidth;
     //subMenuItem._x = menuWidth;
     subMenuItem._y = j*(menuBarHeigth+1);
    }
    subMenuItem.menuLable = subMenuArray[i][j][0];
    //下面是用hitTest来确定是否关闭子菜单,这是一个关键性技巧
    subMenuItem.onRollOut=function(){
     if (!this._parent.hitTest(_root._xmouse, _root._ymouse, false)){
      this._parent._visible = false;
     }    
    }
    subMenuItem.menuUrl = subMenuArray[i][j][1];
    subMenuItem.onPress=function(){
     //测试用
     _root.url.text=this.menuUrl+" will be loaded.";
     //getURL(this.menuUrl);
    }
    n++;
   }
  }
  
  delete mainMenuArray;
  delete subMenuArray;
  delete _menu_xml;
 }
 
 private function showSubMenu(i:Number):Void {
  for (var j=0; j<_totalMenuItem; j++){
   var tempMC:MovieClip = eval("this."+j);
   if (i!=j){
    tempMC._visible = false;
   }else{
    tempMC._visible = true;
   }
  }
 }
 private function closeSubMenu(i:Number):Void {
  var tempMC:MovieClip = eval("this."+i);
  tempMC._visible = false;
 }
 //给外界提供的导入XML文件方法  
 public function loadXML(xn:String):Void {
  _menu_xml.load(xn);
  _menu_xml.addEventListener("onMenuDataLoaded", this);
 }
 //给外界提供设置子菜单的排列方向的方法
 public function set Row(i:Boolean):Void {
  subMenuBarRow = i;
 }
}

/*
数组结构图
  |-0 [lable,url]
  |-1 [lable,url]
mainMenuArray  -|-2 [lable,url]
  |-3 [lable,url]
  |-4 [lable,url]
       |-0 [lable,url]
        |-1 [lable,url]
  |-0 -|-2 [lable,url]
  |-1  |-3 [lable,url]
subMenuArray   -|-2
  |-3  |-0 [lable,url]
  |-4 -|-1 [lable,url]
       |-2 [lable,url]
*/



 

import mx.events.EventDispatcher;
class MenuXMLModel extends XML {
 private var mainmenu:Array;
 private var submenu:Array;
 public var addEventListener:Function;
 public var removeEventListener:Function;
 private var dispatchEvent:Function;
 private static var _mixin1 = EventDispatcher.initialize(MenuXMLModel.prototype);
 
 public function MenuXMLModel() {
  mainmenu = new Array();
  submenu = new Array();
  ignoreWhite = true;
 }
 private function onLoad():Void {
  var tempA = new Array();
  var tempB = new Array();
  tempA = this.firstChild.childNodes;
  for (var i=0; i<tempA.length; i++){
   mainmenu[i]=[tempA[i].attributes.lable,tempA[i].attributes.url];
   tempB = tempA[i].childNodes;
   var tempC = new Array();
   for (var j=0; j<tempB.length; j++){
    tempC[j]=[tempB[j].attributes.lable,tempB[j].attributes.url];
   }
   submenu[i]=tempC;
   delete tempC;
  }
  this.dispatchEvent({type:"onMenuDataLoaded", target:this});
 }
 public function getMainMenuArray():Array {
  return mainmenu;
 }
 public function getSubMenuArray():Array {
  return submenu;
 }
}

MenuView.as(as2.0类,用于设置单个菜单项目的属性)

class MenuView extends MovieClip {
 
 private var _menuLable;
 private var _menuUrl;
 private var _sn;
 
 private function MenuView() {
 }
 
 public function set menuLable(i:String):Void {
  _menuLable.text = i;
 }
 public function set menuUrl(i:String):Void {
  _menuUrl = i;
 }
 public function set sn(i:Number):Void {
  _sn = i;
 } 
 public function get menuUrl():String {
  return _menuUrl;
 }
 public function get menuLable():String {
  return _menuLable.text;
 }
 public function get sn():Number {
  return _sn;
 }
}

MenuPresenter.as(表示器,用来组织如何显示菜单的as2.0类)

import MenuXMLModel;
class MenuPresenter extends MovieClip {
 
 private var _totalMenuItem:Number;
 private var _menu_xml:MenuXMLModel;
 private var mainMenuArray:Array;
 private var subMenuArray:Array;
 private var menuBarWidth:Number = Stage.width;
 private var menuBarHeigth:Number = 22;
 private var menuBarX:Number;
 private var menuBarY:Number;
 private var subMenuBarRow:Boolean = false;
 
 public function MenuPresenter() {
  _menu_xml = new MenuXMLModel();
  this.loadXML("menuData.xml");
 }
 
 private function onMenuDataLoaded():Void {
  //得到贮存菜单数据的数组及菜单数量
  mainMenuArray=_menu_xml.getMainMenuArray();
  subMenuArray =_menu_xml.getSubMenuArray();
  _totalMenuItem = mainMenuArray.length;
  
  //设定整个菜单的位置参数值
  menuBarX = 0;
  menuBarY = 0;
  //设定单个菜单的宽度
  var menuWidth:Number = menuBarWidth/_totalMenuItem;
  
  //一次性把主菜单及所有的下拉MC都建立,使用户访问更快
  //主菜单
  var menuBar:MovieClip;
  var menuItem:MovieClip;
  menuBar=this.createEmptyMovieClip("mainMenuBar",100);
  menuBar._x = menuBarX;
  menuBar._y = menuBarY;
  for (var i = 0; i<_totalMenuItem; i++) {
   menuItem = menuBar.attachMovie("MenuItem", "MenuItem_"+i, 100+i);
   menuItem._width = menuWidth;
   menuItem._x = menuWidth/2 + i*menuWidth;
   menuItem.menuLable = mainMenuArray[i][0];
   //根据是否存在下拉菜单进行设置
   if (mainMenuArray[i][1]==undefined) {
    menuItem.sn=i;
    menuItem.onRollOver=function(){
     var owner:Object = this._parent._parent;
     owner.showSubMenu(this.sn);
    }
    menuItem.onPress=function(){
     //这里加上条件判断是对用户试探性点击做出的回应
     var owner:Object = this._parent._parent;
     var tempMC:MovieClip = eval(owner+"."+this.sn);
     if (tempMC._visible == true){
      owner.closeSubMenu(this.sn)
     }else{
      owner.showSubMenu(this.sn);
     }
    }
   }else{
    menuItem.menuUrl = mainMenuArray[i][1];
    menuItem.onPress=function(){
     //测试用
     _root.url.text=this.menuUrl+" will be loaded.";
     //getURL(this.menuUrl);
    }
   }
  }
  //建立各子菜单
  var subMenuBar:MovieClip;
  var subMenuItem:MovieClip;
  //子菜单的数量根据XML文件内容确定
  for (var i = 0; i<_totalMenuItem; i++){
   //对于只有一级菜单的不建立子菜单(主菜单有lable且有url说明没有下级菜单)
   if (mainMenuArray[i][1]!=undefined) continue; 
   
   //这是放置子菜单的MC(用i来设置新名称是为了方便控制,因为这个i也就是菜单对应数据在数组中的位置)
   //子菜单的位置应该由上级菜单位置确定,这样美观,但得根据数量动态设定,有一定难度
   subMenuBar = this.createEmptyMovieClip(i,i);
   subMenuBar._visible = false; 
   subMenuBar._x = menuBarX + i*menuWidth + menuWidth/2;
   subMenuBar._y = menuBarY + menuBarHeigth + 1;
   //每个子菜单里的MC
   var n:Number=0;
   for (var j=0; j<subMenuArray[i].length; j++){
    subMenuItem = subMenuBar.attachMovie("MenuItem", "subMenuItem_"+n, 100+n);
    //根据subMenuBarRow的真假来确定子菜单是横排还是竖排
    if (subMenuBarRow){
     subMenuItem._width = menuWidth;
     subMenuItem._x = j*menuWidth;
    }else{
     subMenuItem._width = menuWidth;
     //subMenuItem._x = menuWidth;
     subMenuItem._y = j*(menuBarHeigth+1);
    }
    subMenuItem.menuLable = subMenuArray[i][j][0];
    //下面是用hitTest来确定是否关闭子菜单,这是一个关键性技巧
    subMenuItem.onRollOut=function(){
     if (!this._parent.hitTest(_root._xmouse, _root._ymouse, false)){
      this._parent._visible = false;
     }    
    }
    subMenuItem.menuUrl = subMenuArray[i][j][1];
    subMenuItem.onPress=function(){
     //测试用
     _root.url.text=this.menuUrl+" will be loaded.";
     //getURL(this.menuUrl);
    }
    n++;
   }
  }
  
  delete mainMenuArray;
  delete subMenuArray;
  delete _menu_xml;
 }
 
 private function showSubMenu(i:Number):Void {
  for (var j=0; j<_totalMenuItem; j++){
   var tempMC:MovieClip = eval("this."+j);
   if (i!=j){
    tempMC._visible = false;
   }else{
    tempMC._visible = true;
   }
  }
 }
 private function closeSubMenu(i:Number):Void {
  var tempMC:MovieClip = eval("this."+i);
  tempMC._visible = false;
 }
 //给外界提供的导入XML文件方法  
 public function loadXML(xn:String):Void {
  _menu_xml.load(xn);
  _menu_xml.addEventListener("onMenuDataLoaded", this);
 }
 //给外界提供设置子菜单的排列方向的方法
 public function set Row(i:Boolean):Void {
  subMenuBarRow = i;
 }
}

/*
数组结构图
  |-0 [lable,url]
  |-1 [lable,url]
mainMenuArray  -|-2 [lable,url]
  |-3 [lable,url]
  |-4 [lable,url]
       |-0 [lable,url]
        |-1 [lable,url]
  |-0 -|-2 [lable,url]
  |-1  |-3 [lable,url]
subMenuArray   -|-2
  |-3  |-0 [lable,url]
  |-4 -|-1 [lable,url]
       |-2 [lable,url]
*/



 

import mx.events.EventDispatcher;
class MenuXMLModel extends XML {
 private var mainmenu:Array;
 private var submenu:Array;
 public var addEventListener:Function;
 public var removeEventListener:Function;
 private var dispatchEvent:Function;
 private static var _mixin1 = EventDispatcher.initialize(MenuXMLModel.prototype);
 
 public function MenuXMLModel() {
  mainmenu = new Array();
  submenu = new Array();
  ignoreWhite = true;
 }
 private function onLoad():Void {
  var tempA = new Array();
  var tempB = new Array();
  tempA = this.firstChild.childNodes;
  for (var i=0; i<tempA.length; i++){
   mainmenu[i]=[tempA[i].attributes.lable,tempA[i].attributes.url];
   tempB = tempA[i].childNodes;
   var tempC = new Array();
   for (var j=0; j<tempB.length; j++){
    tempC[j]=[tempB[j].attributes.lable,tempB[j].attributes.url];
   }
   submenu[i]=tempC;
   delete tempC;
  }
  this.dispatchEvent({type:"onMenuDataLoaded", target:this});
 }
 public function getMainMenuArray():Array {
  return mainmenu;
 }
 public function getSubMenuArray():Array {
  return submenu;
 }
}

MenuView.as(as2.0类,用于设置单个菜单项目的属性)

class MenuView extends MovieClip {
 
 private var _menuLable;
 private var _menuUrl;
 private var _sn;
 
 private function MenuView() {
 }
 
 public function set menuLable(i:String):Void {
  _menuLable.text = i;
 }
 public function set menuUrl(i:String):Void {
  _menuUrl = i;
 }
 public function set sn(i:Number):Void {
  _sn = i;
 } 
 public function get menuUrl():String {
  return _menuUrl;
 }
 public function get menuLable():String {
  return _menuLable.text;
 }
 public function get sn():Number {
  return _sn;
 }
}

MenuPresenter.as(表示器,用来组织如何显示菜单的as2.0类)

import MenuXMLModel;
class MenuPresenter extends MovieClip {
 
 private var _totalMenuItem:Number;
 private var _menu_xml:MenuXMLModel;
 private var mainMenuArray:Array;
 private var subMenuArray:Array;
 private var menuBarWidth:Number = Stage.width;
 private var menuBarHeigth:Number = 22;
 private var menuBarX:Number;
 private var menuBarY:Number;
 private var subMenuBarRow:Boolean = false;
 
 public function MenuPresenter() {
  _menu_xml = new MenuXMLModel();
  this.loadXML("menuData.xml");
 }
 
 private function onMenuDataLoaded():Void {
  //得到贮存菜单数据的数组及菜单数量
  mainMenuArray=_menu_xml.getMainMenuArray();
  subMenuArray =_menu_xml.getSubMenuArray();
  _totalMenuItem = mainMenuArray.length;
  
  //设定整个菜单的位置参数值
  menuBarX = 0;
  menuBarY = 0;
  //设定单个菜单的宽度
  var menuWidth:Number = menuBarWidth/_totalMenuItem;
  
  //一次性把主菜单及所有的下拉MC都建立,使用户访问更快
  //主菜单
  var menuBar:MovieClip;
  var menuItem:MovieClip;
  menuBar=this.createEmptyMovieClip("mainMenuBar",100);
  menuBar._x = menuBarX;
  menuBar._y = menuBarY;
  for (var i = 0; i<_totalMenuItem; i++) {
   menuItem = menuBar.attachMovie("MenuItem", "MenuItem_"+i, 100+i);
   menuItem._width = menuWidth;
   menuItem._x = menuWidth/2 + i*menuWidth;
   menuItem.menuLable = mainMenuArray[i][0];
   //根据是否存在下拉菜单进行设置
   if (mainMenuArray[i][1]==undefined) {
    menuItem.sn=i;
    menuItem.onRollOver=function(){
     var owner:Object = this._parent._parent;
     owner.showSubMenu(this.sn);
    }
    menuItem.onPress=function(){
     //这里加上条件判断是对用户试探性点击做出的回应
     var owner:Object = this._parent._parent;
     var tempMC:MovieClip = eval(owner+"."+this.sn);
     if (tempMC._visible == true){
      owner.closeSubMenu(this.sn)
     }else{
      owner.showSubMenu(this.sn);
     }
    }
   }else{
    menuItem.menuUrl = mainMenuArray[i][1];
    menuItem.onPress=function(){
     //测试用
     _root.url.text=this.menuUrl+" will be loaded.";
     //getURL(this.menuUrl);
    }
   }
  }
  //建立各子菜单
  var subMenuBar:MovieClip;
  var subMenuItem:MovieClip;
  //子菜单的数量根据XML文件内容确定
  for (var i = 0; i<_totalMenuItem; i++){
   //对于只有一级菜单的不建立子菜单(主菜单有lable且有url说明没有下级菜单)
   if (mainMenuArray[i][1]!=undefined) continue; 
   
   //这是放置子菜单的MC(用i来设置新名称是为了方便控制,因为这个i也就是菜单对应数据在数组中的位置)
   //子菜单的位置应该由上级菜单位置确定,这样美观,但得根据数量动态设定,有一定难度
   subMenuBar = this.createEmptyMovieClip(i,i);
   subMenuBar._visible = false; 
   subMenuBar._x = menuBarX + i*menuWidth + menuWidth/2;
   subMenuBar._y = menuBarY + menuBarHeigth + 1;
   //每个子菜单里的MC
   var n:Number=0;
   for (var j=0; j<subMenuArray[i].length; j++){
    subMenuItem = subMenuBar.attachMovie("MenuItem", "subMenuItem_"+n, 100+n);
    //根据subMenuBarRow的真假来确定子菜单是横排还是竖排
    if (subMenuBarRow){
     subMenuItem._width = menuWidth;
     subMenuItem._x = j*menuWidth;
    }else{
     subMenuItem._width = menuWidth;
     //subMenuItem._x = menuWidth;
     subMenuItem._y = j*(menuBarHeigth+1);
    }
    subMenuItem.menuLable = subMenuArray[i][j][0];
    //下面是用hitTest来确定是否关闭子菜单,这是一个关键性技巧
    subMenuItem.onRollOut=function(){
     if (!this._parent.hitTest(_root._xmouse, _root._ymouse, false)){
      this._parent._visible = false;
     }    
    }
    subMenuItem.menuUrl = subMenuArray[i][j][1];
    subMenuItem.onPress=function(){
     //测试用
     _root.url.text=this.menuUrl+" will be loaded.";
     //getURL(this.menuUrl);
    }
    n++;
   }
  }
  
  delete mainMenuArray;
  delete subMenuArray;
  delete _menu_xml;
 }
 
 private function showSubMenu(i:Number):Void {
  for (var j=0; j<_totalMenuItem; j++){
   var tempMC:MovieClip = eval("this."+j);
   if (i!=j){
    tempMC._visible = false;
   }else{
    tempMC._visible = true;
   }
  }
 }
 private function closeSubMenu(i:Number):Void {
  var tempMC:MovieClip = eval("this."+i);
  tempMC._visible = false;
 }
 //给外界提供的导入XML文件方法  
 public function loadXML(xn:String):Void {
  _menu_xml.load(xn);
  _menu_xml.addEventListener("onMenuDataLoaded", this);
 }
 //给外界提供设置子菜单的排列方向的方法
 public function set Row(i:Boolean):Void {
  subMenuBarRow = i;
 }
}

/*
数组结构图
  |-0 [lable,url]
  |-1 [lable,url]
mainMenuArray  -|-2 [lable,url]
  |-3 [lable,url]
  |-4 [lable,url]
       |-0 [lable,url]
        |-1 [lable,url]
  |-0 -|-2 [lable,url]
  |-1  |-3 [lable,url]
subMenuArray   -|-2
  |-3  |-0 [lable,url]
  |-4 -|-1 [lable,url]
       |-2 [lable,url]
*/

相关文章:

对"用as2.0写导航菜单"发表评论:

热门Flash 最新Flash 热门小说 最新小说

 

Copyright@2005-2006 精品Flash www.WooGood.com All Right Reserved

联系信箱: gold1686tom.com