原创:写个多点触控常见的任意旋转缩放效果类

 

效果:(先点击确定旋转点,再点击拖动实现旋转以及缩放

package
{
	import flash.display.DisplayObjectContainer;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	
	/**
	 * @author rock506
	 */
	public class ArbitraryRotationSprite extends Sprite
	{

		private var _child:Sprite;
		private var _firstPoint:Sprite;
		private var _container:DisplayObjectContainer;
		private var _sLoc:Point;
		private var _scaleLoc:Point;
		private var _scaleDis:Number;
		private var _scaleAngle:Number;
		private var _prevAngle:Number;
		private var _prevScale:Number;
		private var _state:String;

		public function ArbitraryRotationSprite(child:Sprite, container:DisplayObjectContainer,x:Number=0,y:Number=0)
		{
			// constructor code
			this.x = x;
			this.y = y;
			_child = child;
			_container = container;
			_firstPoint = getCircle();
			_firstPoint.visible = false;
			addChild(_child);
			addChild(_firstPoint);
			initValue();
			initListener();
		}

		private function initValue():void
		{
			_sLoc = this.localToGlobal(new Point(_child.x, _child.y));
			_scaleLoc = new Point(0, 0);
			_prevAngle = 0;
			_prevScale = 1;
			_state = "Wait_First_Point";
		}

		private function initListener():void
		{
			addEventListener(Event.ENTER_FRAME, onLoop);
			addEventListener(MouseEvent.MOUSE_DOWN, onDown);
			_container.addEventListener(MouseEvent.MOUSE_UP, onUp);
			_container.addEventListener(MouseEvent.MOUSE_MOVE, onMove);
		}

		private function onDown(e:MouseEvent):void
		{
			if (_state == "Wait_First_Point")
			{
				_state = "Wait_First_Point_OK";
				this.x = _container.mouseX;
				this.y = _container.mouseY;
				var point:Point = this.globalToLocal(_sLoc);
				_child.x = point.x;
				_child.y = point.y;
				_firstPoint.visible = true;
			}
			else if (_state == "Wait_Second_Point")
			{
				_state = "Wait_Second_Point_OK";
				_scaleLoc = new Point(_container.mouseX - this.x, _container.mouseY - this.y);
				_scaleDis = Math.sqrt(_scaleLoc.x*_scaleLoc.x+_scaleLoc.y*_scaleLoc.y);
				_scaleAngle = Math.atan2(_scaleLoc.y, _scaleLoc.x) * 180 / Math.PI;
			}
		}

		private function onUp(e:MouseEvent):void
		{
			if (_state == "Wait_First_Point_OK")
			{
				_state = "Wait_Second_Point";
			}
			else if (_state == "Wait_Second_Point_OK" )
			{
				_state = "Wait_First_Point";
				_prevScale = this.scaleX;
				_prevAngle = this.rotation;
				_firstPoint.visible = false;
			}
			else if ( _state == "MOVE")
			{
				_state = "Wait_First_Point";
				_sLoc = this.localToGlobal(new Point(_child.x, _child.y));
				_firstPoint.visible = false;
			}
		}

		private function onLoop(e:Event):void
		{
			if (_state == "Wait_Second_Point_OK")
			{
				var angle:Number = Math.atan2(_container.mouseY - this.y, _container.mouseX - this.x) * 180 / Math.PI;
				this.rotation = _prevAngle + angle - _scaleAngle;
				var dx:Number = _container.mouseX - this.x;
				var dy:Number = _container.mouseY - this.y;
				var dis:Number = Math.sqrt(dx * dx + dy * dy);
				this.scaleX = this.scaleY = _prevScale * dis / _scaleDis;
				_sLoc = this.localToGlobal(new Point(_child.x, _child.y));
			}
		}

		private function onMove(e:MouseEvent):void
		{
			if (_state == "Wait_First_Point_OK")
			{
				_state = "MOVE";
			}
			else if (_state == "MOVE")
			{
				this.x = _container.mouseX;
				this.y = _container.mouseY;
				e.updateAfterEvent();
			}
		}

		private function getCircle():Sprite
		{
			var sp:Sprite = new Sprite();
			sp.graphics.lineStyle(1, 0,0.3);
			sp.graphics.beginFill(0, 0.3);
			sp.graphics.drawCircle( 0, 0, 5);
			sp.graphics.endFill();
			sp.graphics.moveTo(-3,0);
			sp.graphics.lineTo(3, 0);
			sp.graphics.moveTo(0,-3);
			sp.graphics.lineTo(0,3);
			return sp;
		}
	}

}

 

//使用
var ars:ArbitraryRotationSprite=new ArbitraryRotationSprite(sp,stage);
addChild(ars);
posted @ 2010-09-11 16:04  rock506  阅读(422)  评论(1编辑  收藏  举报