 			touch  = event.getTouch(this, TouchPhase.ENDED);
 			onTouchEnd(touch)
 			
-			
-			
-			//if (touch && touch.tapCount == 2)
-			//				parent.addChild(this); // bring self to front
-			
-			// enable this code to see when you're hovering over the object
-			//			 touch = event.getTouch(this, TouchPhase.HOVER);            
-			//			 alpha = touch ? 0.8 : 1.0;
-			
-		}
-		private function onTouchBegan(touch:Touch)
-		{
-			
-		}
-		
+		}
+		
+		/**當touch開始**/
+		protected function onTouchBegan(touch:Touch):void
+		{
+			//touch 開始要做的事情
+			if(touch){
+				if(_touchBringToFront){				
+					parent.addChild(this);				
+				}			
+				selected = true
+			}
+			
+		}
 		
 		/**當touch結束**/
-		private function onTouchEnd(touch:Touch){
-//			_touchBringToFront
-		}
-		
+		protected function onTouchEnd(touch:Touch):void
+		{
+			
+		}
+		
+		/**檢查是否touch 控制按鈕**/
+		protected function isTouchCtrlButton(target:*):Boolean
+		{			
+			
+			var _do		:DisplayObject
+			var _doc	:DisplayObjectContainer
+			
+			if(_ctrlButton is  DisplayObjectContainer){
+				_doc = _ctrlButton as DisplayObjectContainer
+				return _doc.contains(target)
+			} 
+			else if(_ctrlButton is DisplayObject)
+			{
+				_do = _ctrlButton as DisplayObject
+				return _do == target
+			} 
+			return false			
+		}
+
+		
+		
+		/** 單隻手指使用控制按鈕 放大縮小旋轉 **/
+		protected function resizeAndRotationByCtrlButton(touches:Vector.<Touch>):void
+		{
+			
+			var touchA:Touch = touches[0];
+			var touchB:Touch = touchA.clone();		//模擬B點		
+			var n = touchA.getLocation(this);
+			//鏡射A點坐標
+			touchB.globalX = n.x * 1
+			touchB.globalY = n.y * -1
+			
+			var currentPosA:Point  = touchA.getLocation(this);
+			var previousPosA:Point = touchA.getPreviousLocation(this);
+			
+			//鏡射A點
+			var currentPosB:Point  = currentPosA.clone();
+			currentPosB.x *=-1;
+			currentPosB.y *=-1;				
+			//鏡射A點
+			var previousPosB:Point  = previousPosA.clone();
+			previousPosB.x *=-1;
+			previousPosB.y *=-1;
+			
+			var currentVector:Point  = currentPosA.subtract(currentPosB);
+			var previousVector:Point = previousPosA.subtract(previousPosB);
+			
+			var currentAngle:Number  = Math.atan2(currentVector.y, currentVector.x);
+			var previousAngle:Number = Math.atan2(previousVector.y, previousVector.x);
+			
+			var deltaAngle:Number = currentAngle - previousAngle;
+			
+			// rotate
+			rotation += deltaAngle;
+			
+			// scale
+			var sizeDiff:Number = currentVector.length / previousVector.length;
+			scaleX *= sizeDiff;
+			scaleY *= sizeDiff;
+			
+			//_ctrlButton 保持原比例
+			if(_ctrlButton){
+				_ctrlButton.scaleX /= sizeDiff
+				_ctrlButton.scaleY /= sizeDiff
+			}
+			
+			
+			
+		}
+		
+		/** 使用兩隻手指 使用放大縮小旋轉 保留官方功能 **/
+		protected function resizeAndRotationByTwoFingers(touches:Vector.<Touch>):void
+		{
+			//保留官方原本兩隻手指操作的功能
+			// two fingers touching -> rotate and scale
+			var touchA:Touch = touches[0];
+			var touchB:Touch = touches[1];
+			
+			var currentPosA:Point  = touchA.getLocation(parent);
+			var previousPosA:Point = touchA.getPreviousLocation(parent);
+			var currentPosB:Point  = touchB.getLocation(parent);
+			var previousPosB:Point = touchB.getPreviousLocation(parent);
+			
+			var currentVector:Point  = currentPosA.subtract(currentPosB);
+			var previousVector:Point = previousPosA.subtract(previousPosB);
+			
+			var currentAngle:Number  = Math.atan2(currentVector.y, currentVector.x);
+			var previousAngle:Number = Math.atan2(previousVector.y, previousVector.x);
+			var deltaAngle:Number = currentAngle - previousAngle;
+			
+			// update pivot point based on previous center
+			var previousLocalA:Point  = touchA.getPreviousLocation(this);
+			var previousLocalB:Point  = touchB.getPreviousLocation(this);
+			trace(previousLocalA , previousLocalB)
+			
+			pivotX = (previousLocalA.x + previousLocalB.x) * 0.5;
+			pivotY = (previousLocalA.y + previousLocalB.y) * 0.5;
+			
+			// update location based on the current center
+			x = (currentPosA.x + currentPosB.x) * 0.5;
+			y = (currentPosA.y + currentPosB.y) * 0.5;
+			
+			// rotate
+			rotation += deltaAngle;
+			
+			// scale
+			var sizeDiff:Number = currentVector.length / previousVector.length;
+			scaleX *= sizeDiff;
+			scaleY *= sizeDiff;
+		}
 		
 		
 		public override function dispose():void

				_contents = contents
				
			}			
			
			//init SelectGroup
			_selectedGroup = new Sprite()			
			this.addChild(this._selectedGroup);
		}
		
		

//			_useCtrlButton = value;
//		}
		
		//Const Vars
		protected static const CTRL_BUTTON_NAME:String = "HandlectrlBtn"
		public static const ALIGN_CENTER:String = "center"
		public static const ALIGN_LT:String = "LT"
		
		
		
		//UI
		protected var _contents:DisplayObject		
		protected var _ctrlButton:DisplayObject
		protected var _selectedGroup:Sprite
		
		
		public function HandleSheet(contents:DisplayObject=null)
