由于之前的
不太适合多类型的显示对象DisplayObject复合应用,因此实际应用过程中采用了Proxy模式,这样
只要注册时使用对应的显示对象即可。
PS: 由于Blog限制,示例不能再摘要中显示,故请点击文章内部看玩具吧.....
示例:
操作:单击确定旋转/缩放点,按下并拖动鼠标则实现以旋转,鼠标滚轮则缩放对应的点。
源码:
- package com.xintend.util {
- import flash.display.DisplayObject;
- import flash.display.Sprite;
- import flash.geom.Point;
- import flash.utils.Proxy;
- import flash.utils.flash_proxy;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- public dynamic class DynamicRegistrationProxy extends Proxy {
-
- public function DynamicRegistrationProxy(source:DisplayObject=null):void {
- _displayObject = source || new Sprite();
- }
-
- override flash_proxy function callProperty(methodName:*, ... args):* {
- var res:*;
- var a:Point;
- var b:Point;
- var method:String = methodName.toString();
- var property:String;
- switch (method) {
- case 'setRegistrationByStage':
- a = _displayObject.globalToLocal(new Point(args[0], args[1]));
- _stageRegX = args[0];
- _stageRegY = args[1];
- _regX = a.x;
- _regY = a.y;
- break;
- case 'setRegistrationBySelf':
- a = _displayObject.localToGlobal(new Point(args[0], args[1]));
- _regX = args[0];
- _regY = args[1];
- _stageRegX = a.x;
- _stageRegY = a.y;
- break;
- case 'setPropRel':
- a = _displayObject.parent.globalToLocal(_displayObject.localToGlobal(new Point(_regX, _regY)));
- property = args[0].toString();
- _displayObject[property] = args[1];
- b = _displayObject.parent.globalToLocal(_displayObject.localToGlobal(new Point(_regX, _regY)));
- _displayObject.x -= b.x - a.x;
- _displayObject.y -= b.y - a.y;
- break;
- default:
- res = _displayObject[method].apply(_displayObject, args);
- break;
- }
- return res;
- }
-
- override flash_proxy function getProperty(name:*):* {
- var res:*;
- var property:String = name.toString();
- switch (property) {
- case 'regX':
- res = _regX;
- break;
- case 'regY':
- res = _regY;
- break;
- case 'stageRegX':
- res = _stageRegX;
- break;
- case 'stageRegY':
- res = _stageRegY;
- break;
- case 'x2':
- res = _x2;
- break;
- case 'y2':
- res = _y2;
- break;
- case 'scaleX2':
- res = _displayObject.scaleX;
- break;
- case 'scaleY2':
- res = _displayObject.scaleY;
- break;
- case 'rotation2':
- res = _displayObject.rotation
- break;
- case 'source':
- res = _displayObject;
- break;
- default:
- res = _displayObject[property];
- break;
- }
- return res;
- }
-
- override flash_proxy function setProperty(name:*, value:*):void {
- var property:String = name.toString();
- switch (property) {
- case 'regX':
- _regX = value;
- break;
- case 'regY':
- _regY = value;
- break;
- case 'stageRegX':
- _stageRegX = value;
- break;
- case 'stageRegY':
- _stageRegY = value;
- break;
- case 'x2':
- _x2 += value - _displayObject.x;
- break;
- case 'y2':
- _y2 += value - _displayObject.y;
- break;
- case 'scaleX2':
- flash_proxy::callProperty('setPropRel',"scaleX", value);
- break;
- case 'scaleY2':
- flash_proxy::callProperty('setPropRel',"scaleY", value);
- break;
- case 'rotation2':
- flash_proxy::callProperty('setPropRel',"rotation", value);
- break;
- default:
- _displayObject[property] = value;
- break;
- }
- }
-
-
-
- private var _displayObject:DisplayObject;
- private var _regX:Number = 0;
- private var _regY:Number = 0;
- private var _stageRegX:Number = 0;
- private var _stageRegY:Number = 0;
- private var _x2:Number = 0;
- private var _y2:Number = 0;
- }
-
- }
示例源码:
- package {
-
- import com.xintend.util.DynamicRegistrationProxy;
- import flash.display.Bitmap;
- import flash.display.Sprite;
- import flash.events.MouseEvent;
- import flash.geom.Point;
-
- public class Main extends Sprite {
-
- private var a:DynamicRegistrationProxy;
- private var t:Sprite = new Sprite();
- private var c:CrossHairs = new CrossHairs();
- [Embed(source = '../bin/123.jpg')]private var imge:Class;
- private var b:Bitmap
- public function Main():void {
-
- b=new imge() as Bitmap
-
-
-
-
-
-
-
-
- t.addChild(b);
- c.x = t.x = stage.stageWidth / 2- t.width/2;
- c.y = t.y = stage.stageHeight / 2 - t.height/2;
-
-
- t.addEventListener(MouseEvent.MOUSE_DOWN, handleMOUSE);
- t.addEventListener(MouseEvent.MOUSE_OUT, handleMOUSE);
- t.addEventListener(MouseEvent.MOUSE_WHEEL, handleMOUSE);
-
- a = new DynamicRegistrationProxy(t);
-
- addChild(t);
- addChild(c);
- }
-
- private function handleMOUSE(event:MouseEvent):void {
- switch(event.type) {
- case MouseEvent.MOUSE_DOWN:
- a.setRegistrationByStage(mouseX, mouseY);
-
- c.x = mouseX;
- c.y = mouseY;
- removeEventListener(MouseEvent.MOUSE_DOWN, handleMOUSE);
- addEventListener(MouseEvent.MOUSE_MOVE, handleMOUSE);
- addEventListener(MouseEvent.MOUSE_UP, handleMOUSE);
- break;
- case MouseEvent.MOUSE_MOVE:
-
- a.rotation2 += 5;
-
- break;
- case MouseEvent.MOUSE_UP:
- addEventListener(MouseEvent.MOUSE_DOWN, handleMOUSE);
- removeEventListener(MouseEvent.MOUSE_MOVE, handleMOUSE);
- break;
- case MouseEvent.MOUSE_WHEEL:
- removeEventListener(MouseEvent.MOUSE_MOVE, handleMOUSE);
- c.x = mouseX;
- c.y = mouseY
- a.setRegistrationByStage(mouseX, mouseY);
- a.scaleX2 += event.delta * 0.1;
- a.scaleY2 += event.delta * 0.1;
- break;
- default:
- addEventListener(MouseEvent.MOUSE_DOWN, handleMOUSE);
- removeEventListener(MouseEvent.MOUSE_MOVE, handleMOUSE);
- }
- }
- }
- }
- import flash.display.Shape;
-
- class CrossHairs extends Shape {
- public function CrossHairs() {
- graphics.lineStyle(2,0xFF0000);
- graphics.moveTo( -10, 0);
- graphics.lineTo( 10, 0);
- graphics.moveTo( 0, -10);
- graphics.lineTo( 0, 10);
- }
- }