flash中元件的注册点(锚点)是不能动态改变的,但是我们可以通过AS实现类似的效果。
先看效果:
代码如下:
AnchorMc.as
package { import flash.display.DisplayObject; import flash.display.Shape; import flash.display.Sprite; import flash.geom.Matrix; import flash.geom.Point; import flash.geom.Rectangle; public class AnchorMc extends Sprite { public static const CENTER:String = "center"; public static const LEFT:String = "left"; public static const RIGHT:String = "right"; public var dis:DisplayObject; public function AnchorMc(dis:DisplayObject):void { this.dis = dis; this.addChild(dis); this.x = dis.x; this.y = dis.y; dis.x = dis.y = 0; var sp:Shape = new Shape(); addChild(sp); sp.graphics.beginFill(0x00ff00); sp.graphics.drawCircle(0, 0, 10); sp.graphics.endFill(); } public function setAnchorType(xtype:String, ytype:String):void { var rect:Rectangle = dis.getRect(this); var p:Point = new Point(rect.x,rect.y); switch(xtype) { case LEFT: p.x = rect.x; break; case CENTER: p.x = rect.x+rect.width*0.5; break; case RIGHT: p.x = rect.x+rect.width; break; } switch(ytype) { case LEFT: p.y = rect.y; break; case CENTER: p.y = rect.y+rect.height*0.5; break; case RIGHT: p.y = rect.y+rect.height; break; } setAnchor(p); } public function setAnchor(pos:Point):void { var mt:Matrix = this.transform.matrix; var p:Point = mt.deltaTransformPoint(pos); this.x += p.x; this.y += p.y; dis.x -= pos.x; dis.y -= pos.y; } } }
Main.as
package { import flash.display.MovieClip; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Point; import flash.geom.Rectangle; public class Main extends MovieClip { public var mc:MovieClip; public var p:MovieClip; private var anchorMc:AnchorMc; public function Main() { // constructor code anchorMc = new AnchorMc(mc); addChild(anchorMc); setAnchor(p); addChild(p); //anchorMc.setAnchorType(AnchorMc.CENTER, AnchorMc.CENTER); p.addEventListener(MouseEvent.MOUSE_DOWN, pmouseHandler); addEventListener(Event.ENTER_FRAME, enterFrameHandler); } private function setAnchor(p:MovieClip):void { var rect:Rectangle = p.getRect(anchorMc); anchorMc.setAnchor(new Point(rect.x+rect.width*0.5, rect.y+rect.height*0.5)); } private function enterFrameHandler(e:Event):void { anchorMc.rotation++; } private function pmouseHandler(e:MouseEvent):void { p.startDrag(false, new Rectangle(0, 0, 550, 400)); stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler); stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); } private function mouseMoveHandler(e:MouseEvent):void { setAnchor(p); } private function mouseUpHandler(e:MouseEvent):void { p.stopDrag(); stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler); stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); } } }
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。