TreeCtrl和TreeItem

自己在游戏中经常会用到一些比较复杂的组件,但又不想用那些UI框架,太笨重了,所以自己也写了一些组件,陆续发上来。

下面是一个树形组件,总共有两个类:TreeCtrl和TreeItem

先看示例:

下面是代码:

注:为了缓动效果导入了TweenLite类库,传送门:http://www.greensock.com/tweenlite/

package com.easily.treectrl
{
import com.greensock.TweenLite;

import flash.display.Sprite;
/* *
* @author Easily
*/
public class TreeCtrl extends Sprite
{
private var mListener:TreeItem;
private var mItemList:Array;
private var mHgap:Number;
private var mSpeed:Number;

public function TreeCtrl(listener:TreeItem = null , hgap:Number = 5 , speed:Number = 0.2 )
{
super();
mouseEnabled
= false ;

mListener
= listener;
mHgap
= hgap;
mSpeed
= speed;

mItemList
= [];
}

public function addSubItem(item:TreeItem):TreeItem
{
if (numChildren != 0 )
{
item.y
= height + mHgap;
}
addChild(item);
mItemList.push(item);

return item;
}

public function itemClick(item:TreeItem): void
{
var index:
int = mItemList.indexOf(item);
if (index != - 1 && index != mItemList.length - 1 )
{
adjust(index);
}

if (mListener != null )
{
mListener.childClick();
}
}

public function adjust(index: int ): void
{
var item:TreeItem;

item
= mItemList[index];
var curY:Number
= item.y + item.height + mHgap;

var len:
int = mItemList.length;
for (var j: int = index + 1 ; j < len; ++ j)
{
item
= mItemList[j];
TweenLite.to(item, mSpeed, {y:curY});
curY
+= item.height + mHgap;
}
}

override public function get height():Number
{
var totleHeight:Number
= 0 ;
for each (var item:TreeItem in mItemList)
{
totleHeight
+= item.height + mHgap;
}
totleHeight
-= mHgap;

return totleHeight;
}

public function dispose(): void
{
for each (var item:TreeItem in mItemList)
{
item.dispose();
}
mItemList
= null ;

if (mListener != null )
{
mListener.dispose();
mListener
= null ;
}
}
}
}
package com.easily.treectrl
{
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.MouseEvent;
/* *
* @author Easily
*/
public class TreeItem extends Sprite
{
protected var mListener:TreeCtrl;
protected var mBody:MovieClip;
protected var mSubTree:TreeCtrl;
protected var mHgap:Number;

public function TreeItem(listener:TreeCtrl, hgap:Number = 5 )
{
super();

mListener
= listener;
mHgap
= hgap;

mSubTree
= new TreeCtrl( this );
addChild(mSubTree);
mSubTree.visible
= false ;

addEventListener(MouseEvent.CLICK, onItemClick);
}

public function addSubItem(item:TreeItem):TreeItem
{
return mSubTree.addSubItem(item);
}

private function onItemClick( event :MouseEvent): void
{
event .stopPropagation();

itemClick();
}

protected function itemClick(): void
{
mSubTree.visible
= ! mSubTree.visible;

mListener.itemClick(
this );
}

public function childClick(): void
{
mListener.itemClick(
this );
}

override public function get height():Number
{
if (mSubTree.visible)
{
return mSubTree.height + mHgap + mBody.height;
}

return mBody.height;
}

public function dispose(): void
{
removeEventListener(MouseEvent.CLICK, onItemClick);

if (mSubTree != null )
{
mSubTree.dispose();
mSubTree
= null ;
}

mListener
= null ;
mBody
= null ;
}
}
}

下面是使用的例子:

package test.treectrl
{
import com.easily.treectrl.TreeCtrl;
import com.easily.treectrl.TreeItem;

import flash.display.Sprite;

public class Tree1 extends TreeItem
{
public function Tree1(listener:TreeCtrl, hgap:Number = 5 )
{
super(listener, hgap);

mBody
= new Sprite();
mBody.graphics.beginFill(
0xff0000 );
mBody.graphics.drawRect(
0 , 0 , 100 , 20 );
mBody.graphics.endFill();
addChild(mBody);

mSubTree.y
= mBody.height + mHgap;

mSubTree.addSubItem(
new Tree2(mSubTree));
}
}
}

package test.treectrl
{
import com.easily.treectrl.TreeCtrl;
import com.easily.treectrl.TreeItem;

import flash.display.Sprite;

public class Tree2 extends TreeItem
{
public function Tree2(listener:TreeCtrl, hgap:Number = 5 )
{
super(listener, hgap);

mBody
= new Sprite();
mBody.graphics.beginFill(
0x00ff00 );
mBody.graphics.drawRect(
0 , 0 , 80 , 20 );
mBody.graphics.endFill();
addChild(mBody);

mSubTree.y
= mBody.height + mHgap;

mSubTree.addSubItem(
new Tree3(mSubTree));
}
}
}

package test.treectrl
{
import com.easily.treectrl.TreeCtrl;
import com.easily.treectrl.TreeItem;

import flash.display.Sprite;

public class Tree3 extends TreeItem
{
public function Tree3(listener:TreeCtrl, hgap:Number = 5 )
{
super(listener, hgap);

mBody
= new Sprite();
mBody.graphics.beginFill(
0x0000ff );
mBody.graphics.drawRect(
0 , 0 , 60 , 20 );
mBody.graphics.endFill();
addChild(mBody);
}
}
}

package test.treectrl
{
import com.easily.treectrl.TreeCtrl;

import flash.display.Sprite;

public class TreeCtrlTest extends Sprite
{
public function TreeCtrlTest()
{
super();

var root:TreeCtrl
= new TreeCtrl();
root.addSubItem(
new Tree1(root));
root.addSubItem(
new Tree1(root));
root.addSubItem(
new Tree1(root));
root.addSubItem(
new Tree1(root));
addChild(root);
}
}
}

你可能感兴趣的:(tree)