AS3UI拼装工具

操作:

鼠标拖动

上下左右键移动1像素

按住shift再按上下左右键移动5像素

视图如下:

package com.lsp.core.utils

{
    import com.lsp.core.component.Message;
    
    import flash.display.DisplayObject;
    import flash.display.DisplayObjectContainer;
    import flash.display.Sprite;
    import flash.events.FocusEvent;
    import flash.events.KeyboardEvent;
    import flash.events.MouseEvent;
    import flash.text.TextField;
    import flash.text.TextFormat;
    import flash.text.TextFormatAlign;
    import flash.utils.Dictionary;
    import flash.utils.getQualifiedClassName;
    import flash.utils.setTimeout;
    
    import game.GameProxy;

    /**
     * 使用方式
     * UIConfig.getInstance().bindDisplayObject(your displayObject);
     * @yaolihua qq:854963846
     * 上下左右控制对象移动 每次移动一个像素
     * 同时按下shift 每次移动5像素
     */
    public class UIConfig
    {
        private static var instance:UIConfig;
        
        private var interactiveObjectList:Dictionary;
        private var startPosition:Dictionary;
        public var endPosition:Dictionary;
        private var positionTxt:Dictionary;
        private var borderDict:Dictionary;
        private var keyDict:Dictionary;
        
        private var sub:int = 15;
        
        private var currentObject:Sprite;
        private var currentMouseObject:Sprite;
        private var parentName:String = "";
        
        public function UIConfig()
        {
            interactiveObjectList = new Dictionary();
            startPosition = new Dictionary();
            endPosition = new Dictionary();
            positionTxt = new Dictionary();
            borderDict = new Dictionary();
            keyDict = new Dictionary();
        }
        
        public static function getInstance():UIConfig
        {
            return instance = instance || new UIConfig();
        }
        
        public function bindDisplayObject(displayObj:DisplayObject):void
        {
            setTimeout(function():void
            {
                var sprite:Sprite = new Sprite();
                sprite.name = displayObj.name;
                var x:Number = displayObj.x;
                var y:Number = displayObj.y;
                var width:Number = displayObj.width;
                var height:Number = displayObj.height;
                if(null == displayObj.parent)
                {
                    throw new Error("目标对象不在舞台上....");
                }
                parentName = getQualifiedClassName(displayObj.parent);
                displayObj.parent.addChildAt(sprite, displayObj.parent.getChildIndex(displayObj));
                sprite.x = x;
                sprite.y = y;
                sprite.addChild(displayObj);
                sprite.mouseChildren = false;
                displayObj.x = 0;
                displayObj.y = 0;
                sprite.width = width;
                sprite.height = height;
                sprite.addEventListener(MouseEvent.CLICK, onMouseClickHandler);
                sprite.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDownHandler);
                sprite.addEventListener(MouseEvent.MOUSE_UP, onMouseUpHandler);
                sprite.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMoveHandler);
                sprite.addEventListener(MouseEvent.DOUBLE_CLICK, onDoubleClickHandler);
                interactiveObjectList[sprite.name] = sprite;
                startPosition[sprite.name] = [sprite.x, sprite.y];
                createFourTxtField(sprite);
                
                GameProxy.stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownHandler);
                GameProxy.stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUpHandler);
            },1000);
        }
        
        private function createFourTxtField(sprite:Sprite):void
        {
            var tfStartPoint:TextField = createTxtField();
            tfStartPoint.htmlText = "<font face='SimSun'>("+sprite.x + "," + sprite.y+")</font>";
            tfStartPoint.width = tfStartPoint.textWidth + 5;
            tfStartPoint.height = tfStartPoint.textHeight + 3;
            tfStartPoint.x = sprite.x - 30;
            tfStartPoint.y = sprite.y - 22;
            sprite.parent.addChild(tfStartPoint);
            tfStartPoint.filters = [ColorFilterUtils.GLOW_FILTER_BLACK];
            tfStartPoint.mouseEnabled = false;
            
            var tfPoint:TextField = createTxtField();
            tfPoint.text = "("+sprite.x + "," + sprite.y+")";
            tfPoint.width = tfPoint.textWidth + 5;
            tfPoint.height = tfPoint.textHeight + 3;
            tfPoint.x = sprite.x + 5;
            tfPoint.y = sprite.y + 5;
            sprite.parent.addChild(tfPoint);
            tfPoint.filters = [ColorFilterUtils.GLOW_FILTER_BLACK];
            tfPoint.mouseEnabled = false;
            
            var tfX:TextField = createTxtField();
            tfX.text = "x\r||\r"+(sprite.x - startPosition[sprite.name][0]);
            tfX.width = tfX.textWidth + 5;
            tfX.height = tfX.textHeight + 20;
            tfX.x = sprite.x - sub;
            tfX.y = sprite.y;
            sprite.parent.addChild(tfX);
            tfX.filters = [ColorFilterUtils.GLOW_FILTER_BLACK];
            tfX.mouseEnabled = false;
            
            var tfY:TextField = createTxtField();
            tfY.text = "y=" +(sprite.y - startPosition[sprite.name][1]);
            tfY.width = tfY.textWidth + 5;
            tfY.height = tfY.textHeight + 3;
            tfY.x = sprite.x;
            tfY.y = sprite.y - sub;
            sprite.parent.addChild(tfY);
            tfY.filters = [ColorFilterUtils.GLOW_FILTER_BLACK];
            tfY.mouseEnabled = false;

            positionTxt[sprite.name] = [tfPoint, tfX, tfY, tfStartPoint];
        }
        
        private function changeTxtValueAndPosition(colorIndex:int):void
        {
            if(null == currentObject)
            {
                return;
            }
            var tfStartPoint:TextField = positionTxt[currentObject.name][3] as TextField;
            tfStartPoint.x = currentObject.x - 30;
            tfStartPoint.y = currentObject.y - 22;
            tfStartPoint.htmlText = "<font color='"+COLOR[colorIndex]+"' face='SimSun'>"+tfStartPoint.text+"</font>";  
            tfStartPoint.visible = true;
            
            var tfPoint:TextField = positionTxt[currentObject.name][0] as TextField;
            tfPoint.text = "("+currentObject.x + "," + currentObject.y+")";
            tfPoint.width = tfPoint.textWidth + 5;
            tfPoint.height = tfPoint.textHeight + 3;
            tfPoint.x = currentObject.x + 5;
            tfPoint.y = currentObject.y + 5;
            tfPoint.htmlText = "<font color='"+COLOR[colorIndex]+"'>"+tfPoint.text+"</font>";
            tfPoint.visible = true;
            
            var tfX:TextField = positionTxt[currentObject.name][1] as TextField;
            tfX.text = "x\r||\r"+(currentObject.x - startPosition[currentObject.name][0]);
            tfX.width = tfX.textWidth + 5;
            tfX.height = tfX.textHeight + 20;
            tfX.x = currentObject.x - sub;
            tfX.y = currentObject.y;
            tfX.htmlText = "<font color='"+COLOR[colorIndex]+"' >"+tfX.text+"</font>";
            tfX.visible = true;
            
            var tfY:TextField = positionTxt[currentObject.name][2] as TextField;
            tfY.text = "y=" +(currentObject.y - startPosition[currentObject.name][1])
            tfY.width = tfY.textWidth + 5;
            tfY.height = tfY.textHeight + 3;
            tfY.x = currentObject.x;
            tfY.y = currentObject.y - sub;
            tfY.htmlText = "<font color='"+COLOR[colorIndex]+"'>"+tfY.text+"</font>";
            tfY.visible = true;
            
            endPosition[currentObject.name] = [currentObject.x, currentObject.y];
        }
        
        private function onMouseMoveHandler(e:MouseEvent):void
        {
            if(null != currentMouseObject)
            {
                changeTxtValueAndPosition(colorIndex);
            }
        }
        
        private function onDoubleClickHandler(e:MouseEvent):void
        {
            if(null != currentMouseObject)
            {
                currentMouseObject.stopDrag();
                currentMouseObject = null;
            }
        }
        
        private function onMouseUpHandler(e:MouseEvent):void
        {
            if(null != currentMouseObject)
            {
                currentMouseObject.stopDrag();
                currentMouseObject = null;
            }
        }
        
        private var mouseStartX:Number;
        private var mouseStartY:Number;
        private function onMouseDownHandler(e:MouseEvent):void
        {
            if(e.target != currentMouseObject)
            {
                currentMouseObject = e.target as Sprite;
                currentMouseObject.startDrag();
            }
        }
        
        private function onMouseClickHandler(e:MouseEvent):void
        {
            if(null == currentObject)
            {
                currentObject = interactiveObjectList[e.target.name];
                currentObject.stage.focus = currentObject;
                drawContainerBorder(currentObject);
                changeTxtValueAndPosition(0);
                
            }
            else if(currentObject.name != e.target.name)
            {
                hideFrame();
                currentObject = interactiveObjectList[e.target.name];
                currentObject.stage.focus = currentObject;
                drawContainerBorder(currentObject);
                changeTxtValueAndPosition(0);
            }
        }
        
        private const COLOR:Array=["#FF0000", "#FFFFFF", "#66CC00", "#0099FF", "#D11AFF", "#FFD528", "#FF6633", "#D70000"];
        private const ENTER:int = 13;
        private const LEFT:int = 37;
        private const UP:int = 38;
        private const RIGHT:int = 39;
        private const DOWN:int = 40;
        private const SHIFT:int = 16;
        private const PAUSE:int = 187;
        private var colorIndex:int = 0;
        private var multiple:int = 1;
        private function onKeyDownHandler(e:KeyboardEvent):void
        {
            keyDict[e.keyCode] = 1;
            if(null == currentObject)
            {
                Message.getInstance().showMessage(["请先选中【"+parentName.split("::")[1]+"】移动的对象,选中后会出现黄边"]);
                return;
            }
            
            if(null != keyDict[SHIFT] && 1 == keyDict[SHIFT])
            {
                multiple = 5;
            }
            else
            {
                multiple = 1;
            }
            
            switch(e.keyCode)
            {
                case LEFT:
                    currentObject.x -= 1*multiple;
                    break;
                case UP:
                    currentObject.y -= 1*multiple;
                    break;
                case RIGHT:
                    currentObject.x += 1*multiple;
                    break;
                case DOWN:
                    currentObject.y += 1*multiple;
                    break;
                default:break;
            }
            
            if(PAUSE == e.keyCode)
            {
                colorIndex = (int(Math.random()*7));
            }
            //显示所有的位置文本
            if(ENTER == e.keyCode)
            {
                showAllTxt();
            }
            
            changeTxtValueAndPosition(colorIndex);
        }
        
        private function showAllTxt():void
        {
            for each(var arr:Array in positionTxt)
            {
                for(var i:int = 0; i < arr.length; i++)
                {
                    arr[i].visible = true;
                }
            }
        }
        
        protected function onKeyUpHandler(e:KeyboardEvent):void
        {
            keyDict[e.keyCode] = 0;
        }
        
        private function hideFrame():void
        {
            for each(var spt:Sprite in borderDict[currentObject.name])
            {
                spt.visible = false;
            }
            
            for(var i:int = 0; i < positionTxt[currentObject.name].length; i++)
            {
                positionTxt[currentObject.name][i].visible = false;
            }
        }
        
        protected function onFocusInHandler(e:FocusEvent):void
        {
            if(null != borderDict[e.target.name])
            {
                for each(var spt:Sprite in borderDict[e.target.name])
                {
                    spt.visible = false;
                }
            }
        }
        
        private function createTxtField():TextField
        {
            var txtField:TextField = new TextField();
            txtField.selectable = false;
            var txtFormat:TextFormat = new TextFormat();
            txtFormat.color = 0xFF0000;
            txtFormat.align = TextFormatAlign.LEFT;
            txtFormat.size = 10;
            txtField.defaultTextFormat = txtFormat;
            return txtField;
        }
        
        private function drawContainerBorder(container:DisplayObjectContainer, lineHeight:int = 1, color:int = 0xFFFF00):void
        {
            if(null == borderDict[container.name])
            {
                var width:Number = container.width;
                var height:Number = container.height;
                var arr:Array = [];
                var alphaNum:Number = 0.2;
                if(0 == width || 0 == height)
                {
                    throw new Error("target displayObject width:0, height:0, can not draw border..");
                }
                var topBorderSprite:Sprite = new Sprite();
                topBorderSprite.graphics.beginFill(color);
                topBorderSprite.graphics.drawRect(0, 0, width, lineHeight);
                topBorderSprite.graphics.endFill();
                container.addChild(topBorderSprite);
                topBorderSprite.alpha = alphaNum;
                arr[arr.length] = topBorderSprite;
                
                var bottomBorderSprite:Sprite = new Sprite();
                bottomBorderSprite.graphics.beginFill(color);
                bottomBorderSprite.graphics.drawRect(0, height-lineHeight, width, lineHeight);
                bottomBorderSprite.graphics.endFill();
                container.addChild(bottomBorderSprite);
                bottomBorderSprite.alpha = alphaNum;
                arr[arr.length] = bottomBorderSprite;
                
                var leftBorderSprite:Sprite = new Sprite();
                leftBorderSprite.graphics.beginFill(color);
                leftBorderSprite.graphics.drawRect(0, 0, lineHeight, height);
                leftBorderSprite.graphics.endFill();
                container.addChild(leftBorderSprite);
                leftBorderSprite.alpha = alphaNum;
                arr[arr.length] = leftBorderSprite;
                
                var rightBorderSprite:Sprite = new Sprite();
                rightBorderSprite.graphics.beginFill(color);
                rightBorderSprite.graphics.drawRect(width-lineHeight, 0,lineHeight, height);
                rightBorderSprite.graphics.endFill();
                container.addChild(rightBorderSprite);
                arr[arr.length] = rightBorderSprite;
                rightBorderSprite.alpha = alphaNum;
                borderDict[container.name] = arr;
            }
            else
            {
                for each(var spt:Sprite in borderDict[container.name])
                {
                    spt.visible = true;
                }
            }
        }
    }

}



你可能感兴趣的:(AS3UI拼装工具)