原创:写个多点触控常见的任意旋转缩放效果类
效果:(先点击确定旋转点,再点击拖动实现旋转以及缩放)
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);