ActionScript 3.0 实现树形菜单。
转自: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类简单应用
{
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 实现树形菜单。相关推荐
- Unity 引擎UGUI之自定义树形菜单(TreeView)
先上几张效果图: 如果你需要的也是这种效果,那你就来对地方了! 目前,我们这个树形菜单展现出来的功能如下: 1.可以动态配置数据源: 2.点击每个元素的上下文菜单按钮(也就是图中的三 ...
- 《ActionScript 3.0基础教程》——1.4 对象参数
本节书摘来自异步社区<ActionScript 3.0基础教程>一书中的第1章,第1.4节,作者: [美]Doug Winnie 更多章节内容可以访问云栖社区"异步社区" ...
- 树形菜单 php,简单的树形菜单_php
table {font-size = 9pt} td {height = 10px} /** * 构造树,初值为0 */ function tree(n) { var id = new Array(& ...
- [转]ActionScript 3.0入门:Hello World、文件读写、数据存储(SharedObject)、与JS互调
本文转自:http://www.cnblogs.com/artwl/p/3396330.html 近期项目中可能要用到Flash存取数据,并与JS互调,所以就看了一下ActionScript 3.0, ...
- SpringMVC+ZTree实现树形菜单权限配置
计划在开源项目里加入权限配置的功能,打算加入zTree实现树形结构. Team的Github开源项目链接:https://github.com/u014427391/jeeplatform 欢迎sta ...
- Java GUI编程:swing JTree实现树形菜单代码示例
package com.zxl;import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode;/*** @Descripti ...
- zTree树形菜单交互选项卡效果实现
1. 添加自定义属性 page 2. 为 ztree 每个树形节点,添加点击事件 <!DOCTYPE html> <html><head><meta char ...
- zTree树形菜单使用实例
在每个节点添加 id 和 pid, id 表示当前节点编号,pid 表示父节点编号 第一步:在页面显示菜单位置,添加 ul设置 class="ztree" 第二步:开启简单数据格式 ...
- DWZ中Tree树形菜单的treeCheck如何获取返回值解决方案
最近在对DWZ和asp.net MVC3进行整合,其中遇到了很多问题,总算一一解决了,今天就说说题目所示的问题解决方案. 想做一个基于角色的权限管理,要对每一个Action进行权限控制.就想用DWZ的 ...
最新文章
- maven 下载包冲突问题
- 如何系统地自学python~知乎_经验分享 | 如何系统地自学 Python?
- Servlet的学习之web路径问题
- MongoDB数据库常见问题
- java类的生命周期
- Magrittr包:简化你的R代码
- 终端天线—7.UWB天线仿真
- devcon命令开启启用/禁用端口
- canvas学习之-七色板
- Oracle数据库打补丁注意事项
- 爬虫实现对于百度文库内容的爬取
- 微信小程序中的网络请求
- Sloth组件之NetRisc.Configuration源代码发布
- 新在线一键制作表白网系统源码
- RabbitMq 消息中间件介绍初体验
- startx 及xinit 介绍(经典)
- dell进入u盘启动模式_如何调整戴尔电脑硬盘模式设置U盘第一启动
- 计算机系统基础实验 pa1
- 笔记本高分屏字体模糊_高分屏字体模糊win10怎么办_Win10系统高分屏字体模糊解决方法...
- 武理校赛A题 ljw的剥削(思维 + map应用)
热门文章
- mysql范式与反范式_给女同事讲解MySQL数据库范式与反范式,她直夸我“技术好”...
- 利用计算思维解决问题人和计算机都能完成,第1课计算机与计算思维.ppt
- 浅谈python+requests实现接口自动化
- Python接口自动化测试框架(基础篇)-- 流程控制之循环语句forwhile
- c语言 打砖块,打砖块
- 运行shell脚本时怎么知道jdk路径_Linux中如何查询运行文件的全路径的方法
- html语言分行,Markdown内嵌Html语言
- 华为鸿蒙去哪里更新,华为鸿蒙OS正式尝鲜版名单更新,升级?还是不升级?
- phpmyadmin执行mysql语句_如何在phpMyAdmin中执行sql语句
- 报名软件批次分类code不能为空_技能鉴定报名软件使用说明