可以简易管理的弹出组件

实现了一个简易的弹出管理器,可以设置是否弹出唯一面板,可以配合其它操作更改面板状态,弹出面板按照一定方式排序
组件代码:

package pizazz.flex4.manager.components.popup{
import spark.components.TitleWindow;

public class PopUpItem{
private var _sign:String = "";
private var _window:TitleWindow = null;
private var _state:String = "";
private var _index:Number = -1;

public function get sign():String{
return _sign;
}

public function get window():TitleWindow{
return _window;
}

public function set state(value:String):void{
_state = value;
}

public function get state():String{
return _state;
}

public function set index(value:Number):void{
_index = value;
}

public function get index():Number{
return _index;
}

public function PopUpItem(window:TitleWindow, sign:String = ""){
_window = window;
_sign = sign;
}
}
}


package pizazz.flex4.manager{
import mx.collections.ArrayCollection;
import mx.core.UIComponent;
import mx.events.CollectionEvent;
import mx.managers.PopUpManager;
import pizazz.flex4.manager.components.popup.PopUpItem;
import spark.components.TitleWindow;

public class PopUp{
private var _num:int = 0;
private const _left:uint = 32;
private const _top:uint = 24;
protected const _unique:Object = {};;
protected const _collection:ArrayCollection = new ArrayCollection();
private static var _popup:PopUp;
protected static var _lock:Boolean = false;
protected static var _container:UIComponent;
/**
* 获取弹出数量(建议使用方法PopUp.getInstance().lenght)
*/
public function get length():int{
return _collection.length;
}

public function PopUp(){
if(!_lock){
_collection.addEventListener(CollectionEvent.COLLECTION_CHANGE,
arrange);
}
}

protected function exist(sign:String):PopUpItem{
return _unique.hasOwnProperty(sign) ?
_unique[sign] as PopUpItem : null;
}

private function arrange(event:CollectionEvent):void{
var _length:int = event.target.length;
var _newItem:PopUpItem = event.items[0] as PopUpItem;
if(_length > _num){
var _xMove:Number = 0;
var _yMove:Number = 0;
var _xInterval:uint = 0;
var _yInterval:uint = 0;
for each(var _oldItem:PopUpItem in _collection){
_xInterval += _left;
_yInterval += _top;
if(_xInterval + _left * 4 > _container.width ||
_yInterval + _top * 4 > _container.height){
_xMove = _xInterval - _container.width +
_left * 16;
_yMove = _top * 2;
}else{
_xMove = _xInterval;
_yMove = _yInterval;
}
if(_xMove > _container.width){
_xMove = _left;
}
}
_newItem.window.x = _xMove;
_newItem.window.y = _yMove;
}
_num = _length;
}

protected function addItem(window:TitleWindow, sign:String = ""):void{
var _item:PopUpItem = new PopUpItem(window, sign);
_collection.addItem(_item);
if(sign != ""){
_unique[sign] = _item;
}
}

protected function removeItem(window:TitleWindow):void{
var _item:PopUpItem = getItemIndex(window);
if(_item){
_collection.removeItemAt(_item.index);
if(_item.sign != "" && exist(_item.sign)){
delete _unique[_item.sign];
}
}
}

protected function updateState(window:TitleWindow,
state:String = ""):void{
var _item:PopUpItem = getItemIndex(window);
if(_item){
_item.state = state;
}
}
/**
* 获取PopUp实例
* @return PopUp实例
*/
public static function getInstance():PopUp{
return _popup;
}
/**
* 初始化组件(只能实例化一次)
* @param container PopUpManager.addPopUp中parent参数
*/
public static function init(container:UIComponent):void{
if(!_lock){
_container = container;
_popup = new PopUp();
_lock = true;
}
}
/**
* 获取面板包装对象
* @param window 面板
* @return 包装对象
*/
public function getItemIndex(window:TitleWindow):PopUpItem{
for(var i:int = 0; i < _collection.length; i ++){
var _item:PopUpItem = _collection.getItemAt(i) as PopUpItem;
if(_item.window == window){
_item.index = i;
return _item;
}
}
return null;
}
/**
* 弹出面板
* @param window 需要弹出的面板
* @param mask 是否为模态窗口
* @param sign 面板弹出唯一标志
*/
public static function openWindow(window:TitleWindow,
mask:Boolean = false, sign:String = ""):Boolean {
var _item:PopUpItem = PopUp.getInstance().exist(sign);
if(_item && _item.window.isPopUp){
PopUpManager.bringToFront(_item.window);
return false;
}
PopUpManager.addPopUp(window, _container, mask);
PopUp.getInstance().addItem(window, sign);
return true;
}
/**
* 关闭面板
* @param window 需要关闭的面板
*/
public static function closeWindow(window:TitleWindow):void {
PopUp.getInstance().removeItem(window);
if(window.isPopUp){
PopUpManager.removePopUp(window);
}
}
/**
* 面板状态改变
* @param window 需要改变状态的面板
* @param state 面板状态
*/
public static function updateState(window:TitleWindow,
state:String = ""):void{
PopUp.getInstance().updateState(window, state);
}
}
}

组件执行:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
minWidth="955" minHeight="600" creationComplete="init()">
<s:layout>
<s:HorizontalLayout />
</s:layout>
<fx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.events.CloseEvent;
import pizazz.flex4.manager.PopUp;
import pizazz.flex4.manager.components.popup.PopUpItem;
import spark.components.TitleWindow;

private var i:int = 0;

private function init():void{
PopUp.init(this);
}

private function onClickA():void{
PopUp.openWindow(windowFactory());
}

private function onClickB():void{
PopUp.openWindow(windowFactory(), false, "unique");
}

private function onClickC():void{
Alert.show("Length: " + PopUp.getInstance().length);
}

private function windowFactory():TitleWindow{
const _window:TitleWindow = new TitleWindow();
_window.width = 320 + i;
_window.height = 240 + i;
_window.title = "" + i++;
_window.addElement(buttonFactory(_window));
_window.addEventListener(CloseEvent.CLOSE,
function(event:CloseEvent):void{
PopUp.closeWindow(_window);
}
);
return _window;
function buttonFactory(window:TitleWindow):Button{
const _button:Button = new Button();
_button.label = "Info";
_button.addEventListener(MouseEvent.CLICK,
function(event:MouseEvent):void{
var _item:PopUpItem =
PopUp.getInstance().getItemIndex(window);
Alert.show("Index: " + _item.index + "\n" +
"Sign: " + _item.sign);
}
);
return _button;
}
}
]]>
</fx:Script>
<s:Button label="一般面板" width="100" click="onClickA()" />
<s:Button label="唯一面板" width="100" click="onClickB()" />
<s:Button label="面板数量" width="100" click="onClickC()" />
</s:Application>

视图:
[img]http://dl.iteye.com/upload/attachment/340333/f735b966-8246-30e4-9685-41f5e0e168c1.png[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值