23
2016
05

双击编辑文本

实现一个现实文本的组件,双击激活编辑状态。

先看效果,双击一下舞台中的元件试试。

获得 Adobe Flash Player

代码如下(大多数代码是为了实现拖动和调整尺寸,可忽略):

package  {
	
	import flash.display.MovieClip;
	import flash.events.FocusEvent;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	import flash.text.TextField;
	import flash.text.TextFieldType;
	
	
	public class Test01 extends MovieClip {
		
		
		public var mc:MovieClip;
		public var tf:TextField;
		public var ku:MovieClip;
		private var hcursor:HCursor;
		public function Test01() {
			// constructor code
			tf = mc.tf;
			ku = mc.ku;
			tf.mouseEnabled = false;
			mc.addEventListener(MouseEvent.CLICK, clickHandler);
			mc.addEventListener(MouseEvent.DOUBLE_CLICK, doubleClickHandler);
			mc.doubleClickEnabled = true;
			
			
			ku.alpha = 0;
			ku.buttonMode = true;
			ku.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownhandler);
			mc.addEventListener(MouseEvent.MOUSE_DOWN, dragHandler);
			
			hcursor = new HCursor()
			addChild(hcursor);
			
		}
		
		
		
		//------------------------光标样式------------------------------
		
		//------------------------拖动------------------------------------
		private function dragHandler(e:MouseEvent):void 
		{
			hcursor.setCursor(HCursor.DRAG);
			mc.startDrag(false);
			stage.addEventListener(MouseEvent.MOUSE_UP, dragUpHandler);
		}
		
		private function dragUpHandler(e:MouseEvent):void 
		{
			
			hcursor.setCursor(HCursor.NORMAL);
			mc.stopDrag();
			stage.removeEventListener(MouseEvent.MOUSE_UP, dragUpHandler);
		}
		//------------------------尺寸调整---------------------------
		private var isScale = false;
		private var scaleTypes:Array = [null, 
										HCursor.SCALE2, HCursor.SCALE1, HCursor.SCALE3, 
										HCursor.SCALE, HCursor.SCALE2, HCursor.SCALE1, 
										HCursor.SCALE3, HCursor.SCALE];
		private function mouseDownhandler(e:MouseEvent):void 
		{
			getDir();
			hcursor.setCursor(scaleTypes[dir]);
			stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
			stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
			e.stopImmediatePropagation();//阻止冒泡
		}
		
		private function getDir():void {
			rect = mc.getBounds(this);
			var p:Point = new Point(mouseX, mouseY);
			if (p.y-rect.y<10) {
				if (p.x-rect.x<10) {
					//左上角
					dir = 1;
				}
				else if (rect.right-p.x<10) {
					//右上角
					dir = 3;
				}
				else {
					//上边
					dir = 2;
				}
			}
			else if(rect.bottom-p.y<10){
				if (p.x-rect.x<10) {
					//左下角
					dir = 7;
				}
				else if (rect.right-p.x<10) {
					//右下角
					dir = 5;
				}
				else {
					//下边
					dir = 6;
				}
			}
			else {
				if (p.x<rect.width/2) {
					//左边
					dir = 8;
				}
				else {
					//右边
					dir = 4;
				}
			}
		}
		
		
		private var rect:Rectangle;
		private var dir:int;
		
		private function mouseUpHandler(e:MouseEvent):void 
		{
			hcursor.setCursor(HCursor.NORMAL);
			stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
			stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
		}
		
		private function mouseMoveHandler(e:MouseEvent):void 
		{
			var rect0:Rectangle = new Rectangle();
			switch(dir) {
				case 1:
					rect0.x = mouseX;
					rect0.y = mouseY;
					rect0.right = rect.right;
					rect0.bottom = rect.bottom;
					break;
				case 2:
					rect0.x = rect.x;
					rect0.y = mouseY;
					rect0.right = rect.right;
					rect0.bottom = rect.bottom;
					break;
				case 3:
					rect0.x = rect.x;
					rect0.y = mouseY;
					rect0.right = mouseX;
					rect0.bottom = rect.bottom;
					break;
				case 4:
					rect0.x = rect.x;
					rect0.y = rect.y;
					rect0.right = mouseX;
					rect0.bottom = rect.bottom;
					break;
				case 5:
					rect0.x = rect.x;
					rect0.y = rect.y;
					rect0.right = mouseX;
					rect0.bottom = mouseY;
					break;
				case 6:
					rect0.x = rect.x;
					rect0.y = rect.y;
					rect0.right = rect.right;
					rect0.bottom = mouseY;
					break;
				case 7:
					rect0.x = mouseX;
					rect0.y = rect.y;
					rect0.right = rect.right;
					rect0.bottom = mouseY;
					break;
				case 8:
					rect0.x = mouseX;
					rect0.y = rect.y;
					rect0.right = rect.right;
					rect0.bottom = rect.bottom;
					break;
			}
			
			if (rect0.width >= miniWidth&&rect0.width <= maxWidth) {
				mc.x = rect0.x;
				mc.width = rect0.width;
			}
			if (rect0.height>=miniHeight&&rect0.height<=maxHeight) {
				mc.y = rect0.y;
				mc.height = rect0.height;
			}
		}
		private var miniWidth:int = 100;
		private var miniHeight:int = 100;
		private var maxWidth:int = 1000;
		private var maxHeight:int = 1000;
		
		//-----------------------文本框-------------------------
		private function doubleClickHandler(e:MouseEvent):void 
		{
			toInput();
		}
		
		private function clickHandler(e:MouseEvent):void 
		{
			
		}
		private function toInput():void {
			tf.type = TextFieldType.INPUT;
			tf.selectable = true;
			tf.mouseEnabled = true;
			tf.background = true;
			stage.focus = tf;
			
			stage.addEventListener(FocusEvent.MOUSE_FOCUS_CHANGE, onFocusChange);
		}
		
		private function onFocusChange(e:FocusEvent):void 
		{
			stage.removeEventListener(FocusEvent.MOUSE_FOCUS_CHANGE, onFocusChange);
			toDynamic();
		}
		private function toDynamic():void {
			tf.type = TextFieldType.DYNAMIC;
			tf.selectable = false;
			tf.mouseEnabled = false;
			tf.background = false;
		}
	}
	
}

设置组件的doubleClickEnabled为true,mc.doubleClickEnabled = true;这里要注意,需要将mc的子元素tf的mouseEnabled设置为false,否则触发不了mc的DOUBLE_CLICK事件。

侦听到双击事件时候,用代码将文本框设置为输入文本框,并把焦点设置为文本框。toInput函数实现。

当文本框失去焦点的时候,用代码将文本框设置为动态文本框。toDynamic函数实现。


源码打包下载

« 上一篇下一篇 »

相关文章:

曲线拟合、平滑  (2016-4-27 9:13:10)

使用flashplayer10.1中的p2p NetGroup 来做一个简单的聊天室(转)  (2016-2-22 13:19:14)

as中的包级别函数(转)  (2016-2-22 9:38:2)

as中调用js实现swf全屏  (2015-7-28 9:24:41)

flasCC  (2015-2-5 14:18:31)

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。