转自:http://www.cppblog.com/twzheng/archive/2007/10/19/34598.aspx
主要2个类:给了我不少启发.打算修改成xml,并加上拖动节点,添加删除节点,更名节点的功能.

Flash ActionScript 3.0 实现的树形菜单

这是我初学ActionScript 3.0时实现的treeMenu类, 贴出来分享,或许对ActionScript 3.0的初学者有一定的帮助,但不建议在应用程序开发中使用。

各位博友可以就此发表自己的观点,谢谢各位指教。

下面是treeMenu类的定义:

/**//**
 *    treeMenu类
 *     
 *    构造一个树形菜单
 *    
 *    @author    twzheng (http://www.ugocn.com)
 *    @date    20070903
 *    @version    1.0.070903
 *    
 */

////
//    在这里添加修改说明:
//
//
////

package com.components
{
    import flash.display.MovieClip;
    
    public class treeMenu extends MovieClip
    {
        public var rootMenu:menuItem;
        
        function treeMenu()
        {
        }
        
        public function newTreeMenu()
        {
            if(rootMenu != null)
            {
                trace(" 错误:根菜单已存在,根菜单只能有一个!");
                return;
            }
            rootMenu = new menuItem("rootMenu","rootMenu");
            if(rootMenu == null)
            {
                trace(" 创建根菜单失败!");
                return;
            }
            rootMenu.removeChild(rootMenu.menuLabel);
            rootMenu.childMenu.x = 0;
            rootMenu.childMenu.y = 0;
            this.addChild(rootMenu);
        }
        
        public function addChildMenu(bMenu:menuItem, mName:String, mLabel:String)
        {
            var mItem = new menuItem(mName,mLabel);
            if(mItem == null) return;
            var index:int = bMenu.childItem.length;
            
            mItem.y = menuItemLocalizer(bMenu.childItem);
            
            bMenu.childItem[index] = mItem;
            
            bMenu.childMenu.addChild(mItem);
        }
        
        private function menuItemLocalizer(bMenu:Array):int
        {
            var num:int = 0;
            for each (var item in bMenu)
                num = num + item.getHeight();
            return num;
        }
    }
}

/**//**
 * 菜单项节点类
 * 
 * @author    twzheng (http://www.ugocn.com)
 * @date    20070903
 * @version    1.0.070903
 */    

import flash.display.DisplayObjectContainer;
import flash.display.MovieClip;
import flash.text.TextField;
import flash.events.MouseEvent;
import flash.events.Event;
import flash.ui.Mouse;

internal class menuItem extends MovieClip
{
    public var menuName:String;            // 菜单项名称
    public var menuLabel:TextField;        // 菜单项标签(即显示给用户的菜单标签)
    public var childMenu:DisplayObjectContainer; // 子菜单项容器
    public var childItem:Array;            // 子菜单项数组
    
    private var h:Number;        // 菜单项高度属性,记录的是实际高度(包含隐藏菜单高度)
    
    function menuItem(mName:String, mLabel:String)
    {
        if(mName == "" || mName == null || mLabel == null)
        {
            trace(" 菜单名或者菜单标签为空,添加菜单项失败!");
            return;
        }
        menuName = mName;
        
        menuLabel = new TextField();
        menuLabel.text = mLabel;
        menuLabel.height = 22;
        menuLabel.textColor = 0x000000;
        menuLabel.background = false;
        menuLabel.addEventListener(MouseEvent.MOUSE_MOVE,itemMouseMove);
        menuLabel.addEventListener(MouseEvent.MOUSE_OUT,itemMouseOut);
        this.addChild(menuLabel);
        
        childMenu = new MovieClip();
        childMenu.addEventListener(Event.ADDED,mcAddedEvent);
        childMenu.addEventListener(Event.REMOVED,mcRemovedEvent);
        this.childMenu.x = this.menuLabel.x + 8;
        this.childMenu.y = this.menuLabel.y + this.menuLabel.height;
        this.addChild(childMenu);
        
        childItem = new Array();
        
        this.h = menuLabel.height;
        // 菜单项单击事件应留给外部使用者实现
        //this.menuLabel.addEventListener(MouseEvent.CLICK,itemClick);
    }
    
    // 返回菜单项显示的真实高度,即菜单项的实际高度减去隐藏菜单项的高度
    public function getHeight():Number
    {
        return h - getHideMenu(this);
    }
    
    /**//**
    * 获取item的childMenu中所有隐藏子菜单项的高度和
    *
    * @item                主菜单项,此函数即计算它的子菜单中隐藏菜单的高度
    * @return            返回item的childMenu中visible属性为false的子菜单高度和
    * 
    * 注:如果item.childMenu的visible属性为false即返回childMenu的高度,如果item.childMenu为空则返回0。
    */
    private function getHideMenu(item:menuItem):Number
    {
        var sumHeight = 0;
        if(item.childMenu.visible)
        {
            if(item.childItem == null)
                return 0;
            for(var i = 0; i < item.childItem.length; i++)
            {
                // 对每个子菜单项递归
                sumHeight = sumHeight + getHideMenu(item.childItem[i]);
            }
            return sumHeight;
        }
        else
            return item.childMenu.height;
    }
    
    /**//**
    * 获取名字为mName菜单项的对象
    *
    * @mName            菜单项名字字符串
    * @return            返回调用此函数的菜单项的子菜单中名字为mName的子菜单项对象
    */
    public function getMenu(mName:String):menuItem
    {
        for each(var item in childItem)
        {
            if(item.menuName == mName)
                return item;
        }
        trace(" 错误:不存在名为 " + mName + " 的子菜单项!");
        return null;
    }
    
    /**//**
    * 接收TextField的单击事件,更改TextField对应item的子菜单显示状态
    *
    * @item            接收到单击事件的menuLabel对应的菜单项(menuItem)
    */
    public function chgChildItemVisible(item:menuItem)
    {
        var chgHeight = 0;
        if(item.childMenu.visible)
        {
            chgHeight = item.getHeight() - item.menuLabel.height;
            item.childMenu.visible = false;
            updateMenu(item,0 - chgHeight);
        }
        else
        {
            item.childMenu.visible = true;
            chgHeight = item.childMenu.height - getHideMenu(item);
            updateMenu(item,chgHeight);
        }
    }
    
    /**//**
    * 更新各菜单项位置
    * 注:由于参数item的子菜单容器childMenu高度发生变化而需要改变其同级别的菜单项以及所有的父菜单项的y坐标
    *
    * @item            引发调用此函数的菜单项(即由于item的childMenu高度改变而需要调用此函数)
    * @chgHeight    需要改变的y坐标高度,正值即增加y坐标值,负值减小y坐标值
    */
    private function updateMenu(item:menuItem, chgHeight:Number)
    {
        if(item == null) return;
        // item.parent为父菜单的子菜单容器,item.parent.paren才是对应的父菜单项
        var parentItem = item.parent.parent;

        var i,index:int = 0;
        
        if(parentItem == null || ! (parentItem is menuItem))
            return;
        
        // 搜索item在父菜单的子菜单数组childItem中的索引
        index = parentItem.childItem.indexOf(item);
        
        // 改变item同级别的并且位于其后的菜单项的显示位置
        for(i = index + 1; i < parentItem.childItem.length; i++)
        {
            parentItem.childItem[i].y = parentItem.childItem[i].y + chgHeight;
        }
        
        // 对父菜单项递归
        updateMenu(parentItem,chgHeight);
    }
    
//    private function itemClick(e:MouseEvent)
//    {
//        var item = e.currentTarget;
//        chgChildItemVisible(item.parent);
//    }
    
    private function itemMouseMove(e:MouseEvent)
    {
        var item = e.currentTarget;
        item.background = true;
        item.backgroundColor = 0x66ccFF;
        item.textColor = 0x0000FF;
    }
    
    private function itemMouseOut(e:MouseEvent)
    {
        var item = e.currentTarget;
        item.background = false;
        item.backgroundColor = 0xFFFFFF;
        item.textColor = 0x000000;
    }
    
    // 向子菜单容器加入子菜单项事件,增加当前菜单的高度
    private function mcAddedEvent(e:Event)
    {// 此事件响应函数还需要更改。。。
        var mc = e.currentTarget;
        h = h + 22;//mc.height;///2
    }
    
    // 从子菜单容器移除子菜单项事件,减小当前菜单的高度
    private function mcRemovedEvent(e:Event)
    {// 此事件响应函数还需要更改。。。
        var mc = e.currentTarget;
        h = h - 22;//mc.height/2;
    }
}

treeMenu类简单应用

package 
{
    import flash.display.MovieClip;    
    import flash.events.*;

    import com.library.treeMenu;
    
    public class menu extends MovieClip
    {
        function menu()
        {
            var tm = new treeMenu();
            tm.newTreeMenu();            // 创建根菜单
            
            tm.addChildMenu(tm.rootMenu,"基菜单-01","基菜单-01");
            tm.rootMenu.getMenu("基菜单-01").menuLabel.addEventListener(MouseEvent.CLICK,eventClick);
            
            tm.addChildMenu(tm.rootMenu.getMenu("基菜单-01"),"一级菜单-011","一级菜单-011");
            
            tm.addChildMenu(tm.rootMenu,"基菜单-02","基菜单-02");
            tm.rootMenu.getMenu("基菜单-02").menuLabel.addEventListener(MouseEvent.CLICK,eventClick);
            
            tm.addChildMenu(tm.rootMenu.getMenu("基菜单-02"),"一级菜单-021","一级菜单-021");
            tm.rootMenu.getMenu("基菜单-02").getMenu("一级菜单-021").menuLabel.addEventListener(MouseEvent.CLICK,eventClick);
            
            tm.addChildMenu(tm.rootMenu.getMenu("基菜单-02").getMenu("一级菜单-021"),"二级菜单-0211","二级菜单-0211");
            tm.rootMenu.getMenu("基菜单-02").getMenu("一级菜单-021").getMenu("二级菜单-0211").menuLabel.addEventListener(MouseEvent.CLICK,eventClick);
            
            tm.addChildMenu(tm.rootMenu.getMenu("基菜单-02").getMenu("一级菜单-021").getMenu("二级菜单-0211"),"三级菜单-02111","三级菜单-02111");
            tm.addChildMenu(tm.rootMenu,"基菜单-03","基菜单-03");
            
            // 菜单坐标 默认坐标(0,0)
            //tm.x = 50;
            //tm.y = 50;
            this.addChild(tm);
        }
        
        private function eventClick(e:MouseEvent)
        {
            var item = e.currentTarget;
            item.parent.chgChildItemVisible(item.parent);    // 隐藏或显示子菜单项
        }
    }
}

ActionScript 3.0 实现树形菜单。相关推荐

  1. Unity 引擎UGUI之自定义树形菜单(TreeView)

    先上几张效果图:          如果你需要的也是这种效果,那你就来对地方了! 目前,我们这个树形菜单展现出来的功能如下: 1.可以动态配置数据源: 2.点击每个元素的上下文菜单按钮(也就是图中的三 ...

  2. 《ActionScript 3.0基础教程》——1.4 对象参数

    本节书摘来自异步社区<ActionScript 3.0基础教程>一书中的第1章,第1.4节,作者: [美]Doug Winnie 更多章节内容可以访问云栖社区"异步社区" ...

  3. 树形菜单 php,简单的树形菜单_php

    table {font-size = 9pt} td {height = 10px} /** * 构造树,初值为0 */ function tree(n) { var id = new Array(& ...

  4. [转]ActionScript 3.0入门:Hello World、文件读写、数据存储(SharedObject)、与JS互调

    本文转自:http://www.cnblogs.com/artwl/p/3396330.html 近期项目中可能要用到Flash存取数据,并与JS互调,所以就看了一下ActionScript 3.0, ...

  5. SpringMVC+ZTree实现树形菜单权限配置

    计划在开源项目里加入权限配置的功能,打算加入zTree实现树形结构. Team的Github开源项目链接:https://github.com/u014427391/jeeplatform 欢迎sta ...

  6. Java GUI编程:swing JTree实现树形菜单代码示例

    package com.zxl;import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode;/*** @Descripti ...

  7. zTree树形菜单交互选项卡效果实现

    1. 添加自定义属性 page 2. 为 ztree 每个树形节点,添加点击事件 <!DOCTYPE html> <html><head><meta char ...

  8. zTree树形菜单使用实例

    在每个节点添加 id 和 pid, id 表示当前节点编号,pid 表示父节点编号 第一步:在页面显示菜单位置,添加 ul设置 class="ztree" 第二步:开启简单数据格式 ...

  9. DWZ中Tree树形菜单的treeCheck如何获取返回值解决方案

    最近在对DWZ和asp.net MVC3进行整合,其中遇到了很多问题,总算一一解决了,今天就说说题目所示的问题解决方案. 想做一个基于角色的权限管理,要对每一个Action进行权限控制.就想用DWZ的 ...

最新文章

  1. maven 下载包冲突问题
  2. 如何系统地自学python~知乎_经验分享 | 如何系统地自学 Python?
  3. Servlet的学习之web路径问题
  4. MongoDB数据库常见问题
  5. java类的生命周期
  6. Magrittr包:简化你的R代码
  7. 终端天线—7.UWB天线仿真
  8. devcon命令开启启用/禁用端口
  9. canvas学习之-七色板
  10. Oracle数据库打补丁注意事项
  11. 爬虫实现对于百度文库内容的爬取
  12. 微信小程序中的网络请求
  13. Sloth组件之NetRisc.Configuration源代码发布
  14. 新在线一键制作表白网系统源码
  15. RabbitMq 消息中间件介绍初体验
  16. startx 及xinit 介绍(经典)
  17. dell进入u盘启动模式_如何调整戴尔电脑硬盘模式设置U盘第一启动
  18. 计算机系统基础实验 pa1
  19. 笔记本高分屏字体模糊_高分屏字体模糊win10怎么办_Win10系统高分屏字体模糊解决方法...
  20. 武理校赛A题 ljw的剥削(思维 + map应用)

热门文章

  1. mysql范式与反范式_给女同事讲解MySQL数据库范式与反范式,她直夸我“技术好”...
  2. 利用计算思维解决问题人和计算机都能完成,第1课计算机与计算思维.ppt
  3. 浅谈python+requests实现接口自动化
  4. Python接口自动化测试框架(基础篇)-- 流程控制之循环语句forwhile
  5. c语言 打砖块,打砖块
  6. 运行shell脚本时怎么知道jdk路径_Linux中如何查询运行文件的全路径的方法
  7. html语言分行,Markdown内嵌Html语言
  8. 华为鸿蒙去哪里更新,华为鸿蒙OS正式尝鲜版名单更新,升级?还是不升级?
  9. phpmyadmin执行mysql语句_如何在phpMyAdmin中执行sql语句
  10. 报名软件批次分类code不能为空_技能鉴定报名软件使用说明