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

浙公网安备 33010602011771号