zoukankan      html  css  js  c++  java
  • as3 实现树形菜单并带滚动条

    最近公司要做一个树形菜单,而as3中根本就没有任何的树形组件。本想自己写一个树形菜单,但因为时间紧急所以花了一个晚上的时间在网上终于找到了一个合适的类改了下就ok啦,自己加了个滚动条并且可以更换树背景。核心类分享出来如下

    package tree
    {
    	import flash.display.Sprite;
    	import flash.events.MouseEvent;
    
    	public class TreeNode extends Sprite
    	{
    		protected var bg:Sprite;
    		protected var nodeContainer:Sprite;
    		protected var isOpen:Boolean = true;
    		protected var isHide:Boolean;
    		protected var _c:Sprite;
    		public var isSelected:Boolean = false;
    		public var nodeArr:Array;
    		public var _w:int;
    		public var _h:int;
    		public var _space:int;
    		public var pNode:TreeNode;
    		public var value:Object;
    		public function TreeNode(container:Sprite,data:Object = null,int = 150,height:int = 20,space:int = 0,_isHide:Boolean = false)
    		{
    			super();
    			_c = container ? container : this;
    			_w = width;
    			_h = height;
    			_space = space;
    			isHide = _isHide;
    			init();
    			if(!isHide){
    				setValue(data);
    			}
    		}
    		private function clickHandler(e:MouseEvent):void{
    			if(nodeArr.length > 0){
    				isOpen ? closeList() : openList();
    			}else{
    				_c.dispatchEvent(new TreeEvent(TreeEvent.SELECTED,this));
    			}
    		}
    		private function overHandler(e:MouseEvent):void{
    			if(isSelected){
    				return;
    			}
    			draw(true);
    		}
    		private function outHandler(e:MouseEvent):void{
    			if(isSelected){
    				return;
    			}
    			draw(false);
    		}
    		private function selectedHandler(e:TreeEvent):void{
    			if(nodeArr.length > 0){
    				return;
    			}
    			unSelected();
    			e.node.selected();
    		}
    		private function changeHandler(e:TreeEvent):void{
    			update();
    		}
    		private function unSelected():void{
    			isSelected = false;
    			draw();
    		}
    		public function getNodeByIndex(index:int):TreeNode{
    			if(index < 0 || index >= nodeArr.length){
    				return null;
    			}
    			return nodeArr[index];
    		}
    		public function addNode(node:TreeNode):void{
    			if(nodeArr.length > 0){
    				node.y = nodeArr[nodeArr.length - 1].y + node._h + _space;
    			}else{
    				node.y = 0;
    			}
    			node.pNode = this;
    			nodeContainer.addChild(node);
    			nodeArr.push(node);
    			_c.dispatchEvent(new TreeEvent(TreeEvent.CHANGE));
    			if(nodeArr.length == 1){
    				draw();
    				bg.buttonMode = true;
    			}
    		}
    		public function removeNode(node:TreeNode):void{
    			var index:int = nodeArr.indexOf(node);
    			if(index != -1){
    				var tempNode:TreeNode = nodeArr.splice(index,1)[0];
    				nodeContainer.removeChild(tempNode);
    				tempNode.clear();
    				_c.dispatchEvent(new TreeEvent(TreeEvent.CHANGE));
    				if(nodeArr.length == 0){
    					bg.buttonMode = false;
    					draw();
    				}
    			}
    		}
    		public function update():void{
    			clean();
    			var currentNode:TreeNode;
    			var prevNode:TreeNode;
    			for(var i:int = 0;i < nodeArr.length;i++){
    				currentNode = nodeArr[i];
    				currentNode.x = 0;
    				currentNode.update();
    				if(i == 0){
    					currentNode.y = 0;
    				}else{
    					prevNode = nodeArr[i-1];
    					currentNode.y = prevNode.y + prevNode.height + _space;
    				}
    				nodeContainer.addChild(currentNode);
    			}
    		}
    		public function clean():void{
    			for each(var node:TreeNode in nodeArr){
    				if(node.stage){
    					nodeContainer.removeChild(node);
    				}
    			}
    		}
    		public function clear():void{
    			bg.removeEventListener(MouseEvent.MOUSE_OVER,overHandler);
    			bg.removeEventListener(MouseEvent.MOUSE_OUT,outHandler);
    			bg.removeEventListener(MouseEvent.CLICK,clickHandler);
    			_c.removeEventListener(TreeEvent.CHANGE,changeHandler);
    			_c.removeEventListener(TreeEvent.SELECTED,selectedHandler);
    		}
    		/*
    		 *应该被继承重写的方法
    		 */
    		//树叶节点不用重写
    		public function openList():void{
    			isOpen = true;
    			addChild(nodeContainer);
    			_c.dispatchEvent(new TreeEvent(TreeEvent.CHANGE));
    		}
    		//树叶节点不用重写
    		public function closeList():void{
    			isOpen = false;
    			removeChild(nodeContainer);
    			_c.dispatchEvent(new TreeEvent(TreeEvent.CHANGE));
    		}
    		protected function init():void{
    			nodeArr = new Array();
    			
    			bg = new Sprite();
    			addChild(bg);
    			draw();
    			
    			nodeContainer = new Sprite();
    			nodeContainer.y = _h;
    			addChild(nodeContainer);
    			
    			if(isHide){
    				bg.visible = false;
    				nodeContainer.y = 0;
    			}
    			
    			bg.addEventListener(MouseEvent.MOUSE_OVER,overHandler);
    			bg.addEventListener(MouseEvent.MOUSE_OUT,outHandler);
    			bg.addEventListener(MouseEvent.CLICK,clickHandler);
    			_c.addEventListener(TreeEvent.CHANGE,changeHandler);
    			_c.addEventListener(TreeEvent.SELECTED,selectedHandler);
    		}
    		protected function draw(f:Boolean = false):void{
    			
    		}
    		public function selected():void{
    			isSelected = true;
    		}
    		public function setValue(o:Object):void{
    			value = o;
    		}
    	}
    }
    

    效果图片预览

    效果文件下载地址

  • 相关阅读:
    Docker容器启动时初始化Mysql数据库
    使用Buildpacks高效构建Docker镜像
    Mybatis 强大的结果集映射器resultMap
    Java 集合排序策略接口 Comparator
    Spring MVC 函数式编程进阶
    换一种方式编写 Spring MVC 接口
    【asp.net core 系列】6 实战之 一个项目的完整结构
    【asp.net core 系列】5 布局页和静态资源
    【asp.net core 系列】4. 更高更强的路由
    【Java Spring Cloud 实战之路】- 使用Nacos和网关中心的创建
  • 原文地址:https://www.cnblogs.com/chenhaib/p/2120782.html
Copyright © 2011-2022 走看看