📄 用as2.0写导航菜单 .txt
字号:
用as2.0写导航菜单
作者:FreeBrandy 类型:闪吧BBS 来源:闪吧 介绍: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类,用于设置单个菜单项目的属性)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -