ActionScript 3 TransformGestureEvent 不适用于 SWF MovieClip
ActionScript 3 TransformGestureEvent not working on SWF MovieClip
大家下午好,
我在我的舞台上添加了一个 SWF 并将其转换为一个 MovieClip,我给了那个 MovieClip 和 floorplanMC 的实例名称,现在我正在尝试将 TransformGestureEvent 应用到 floorplanMC 但是当我去测试它时,它没有工作起来就像我要执行完全相同的步骤一样,但使用 jpg 而不是 SWF,它有时只响应 TransformGestureEvent,但每次使用 jpg 时都会响应。为什么这不适用于 SWF 但适用于 JPG?
这是我的代码:
floorplanMC.addEventListener(TransformGestureEvent.GESTURE_ZOOM, zoomFloorplan);
floorplanMC.addEventListener(MouseEvent.MOUSE_DOWN, dragStartFloorplan);
floorplanMC.addEventListener(MouseEvent.MOUSE_UP, dragEndFloorplan);
这是方法
function zoomFloorplan (event:TransformGestureEvent):void{
myTimerModel.stop();
myTimerModel.reset();
myTimerModel.start();
var locX:Number=event.localX;
var locY:Number=event.localY;
var stX:Number=event.stageX;
var stY:Number=event.stageY;
var prevScaleX:Number=floorplanMC.scaleX;
var prevScaleY:Number=floorplanMC.scaleY;
var mat:Matrix;
var externalPoint=new Point(stX,stY);
var internalPoint=new Point(locX,locY);
floorplanMC.scaleX *= event.scaleX;
floorplanMC.scaleY *= event.scaleY;
if(event.scaleX > 1 && floorplanMC.scaleX > 6){
floorplanMC.scaleX=prevScaleX;
floorplanMC.scaleY=prevScaleY;
}
if(event.scaleY > 1 && floorplanMC.scaleY > 6){
floorplanMC.scaleX=prevScaleX;
floorplanMC.scaleY=prevScaleY;
}
if(event.scaleX < 1.1 && floorplanMC.scaleX < 1){
floorplanMC.scaleX=prevScaleX;
floorplanMC.scaleY=prevScaleY;
}
if(event.scaleY < 1.1 && floorplanMC.scaleY < 1){
floorplanMC.scaleX=prevScaleX;
floorplanMC.scaleY=prevScaleY;
}
mat=floorplanMC.transform.matrix.clone();
MatrixTransformer.matchInternalPointWithExternal(mat,internalPoint,externalPoint);
floorplanMC.transform.matrix=mat;
}
function dragStartFloorplan(e:MouseEvent):void
{
myTimerModel.stop();
myTimerModel.reset();
myTimerModel.start();
if(floorplanMC.scaleX > 1 && floorplanMC.scaleY > 1)
{
floorplanMC.startDrag(false, new Rectangle(0,500,-floorplanMC.width + stage.stageWidth, -floorplanMC.height + 1187));
}
}
function dragEndFloorplan(e:MouseEvent):void
{
myTimerModel.stop();
myTimerModel.reset();
myTimerModel.start();
floorplanMC.stopDrag();
}
解决方案
这些事件只会触发您的 SWF 中具有背景的部分。 Transparent 地区不会触发事件。
一个简单的解决方案是在 child SWF 中绘制一个精灵层。
var bg:Sprite = new Sprite();
bg.graphics.beginFill(0xFFFFFF);
bg.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight)
bg.graphics.endFill();
addChild(bg);
示范[=27=]
为了演示,我们将创建两个 .swf
文件。第一个(child)只有一系列条形图。没有任何事件侦听器。
// Child.swf
var size:Number = 50;
for (var i:int = 0; i < stage.stageWidth/(size*2); i++) {
var box:Sprite = new Sprite();
box.graphics.beginFill(0x008cc6);
box.graphics.drawRect(0, 0, size, stage.stageHeight)
box.graphics.endFill();
addChild(box);
box.x = i * (size*2);
}
第二个(parent)加载 child 并将侦听器附加到加载器(我们的 swf 的最顶层容器)。如果你点击一个条,所有的条都会变成绿色。但是,请注意单击条形之间的空白不会产生任何结果。
// Parent.swf
import flash.display.Loader;
import flash.events.MouseEvent;
import flash.display.Sprite;
import fl.motion.Color;
var loader:Loader = new Loader();
loader.load(new URLRequest("child.swf"));
addChild(loader);
loader.addEventListener("mouseDown", cursor);
loader.addEventListener("mouseUp", cursor);
function cursor(e:MouseEvent):void {
var box:Sprite = e.target as Sprite;
var c:Color = new Color();
if (box != null) {
switch (e.type) {
case "mouseDown":
c.setTint(0x00d719, 1);
loader.transform.colorTransform = c;
break;
case "mouseUp":
c.setTint(0x00, 0);
loader.transform.colorTransform = c;
break;
}
}
}
现在让我们用解决方案中提供的后台代码重新编译child。这是修改后的 child 代码。
// Child
var bg:Sprite = new Sprite();
bg.graphics.beginFill(0xFFFFFF);
bg.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight)
bg.graphics.endFill();
addChild(bg);
var size:Number = 50;
for (var i:int = 0; i < stage.stageWidth/(size*2); i++) {
var box:Sprite = new Sprite();
box.graphics.beginFill(0x008cc6);
box.graphics.drawRect(0, 0, size, stage.stageHeight)
box.graphics.endFill();
addChild(box);
box.x = i * (size*2);
}
编译 parent,您会注意到单击任意位置(包括栏之间)都会生成事件。
大家下午好,
我在我的舞台上添加了一个 SWF 并将其转换为一个 MovieClip,我给了那个 MovieClip 和 floorplanMC 的实例名称,现在我正在尝试将 TransformGestureEvent 应用到 floorplanMC 但是当我去测试它时,它没有工作起来就像我要执行完全相同的步骤一样,但使用 jpg 而不是 SWF,它有时只响应 TransformGestureEvent,但每次使用 jpg 时都会响应。为什么这不适用于 SWF 但适用于 JPG?
这是我的代码:
floorplanMC.addEventListener(TransformGestureEvent.GESTURE_ZOOM, zoomFloorplan);
floorplanMC.addEventListener(MouseEvent.MOUSE_DOWN, dragStartFloorplan);
floorplanMC.addEventListener(MouseEvent.MOUSE_UP, dragEndFloorplan);
这是方法
function zoomFloorplan (event:TransformGestureEvent):void{
myTimerModel.stop();
myTimerModel.reset();
myTimerModel.start();
var locX:Number=event.localX;
var locY:Number=event.localY;
var stX:Number=event.stageX;
var stY:Number=event.stageY;
var prevScaleX:Number=floorplanMC.scaleX;
var prevScaleY:Number=floorplanMC.scaleY;
var mat:Matrix;
var externalPoint=new Point(stX,stY);
var internalPoint=new Point(locX,locY);
floorplanMC.scaleX *= event.scaleX;
floorplanMC.scaleY *= event.scaleY;
if(event.scaleX > 1 && floorplanMC.scaleX > 6){
floorplanMC.scaleX=prevScaleX;
floorplanMC.scaleY=prevScaleY;
}
if(event.scaleY > 1 && floorplanMC.scaleY > 6){
floorplanMC.scaleX=prevScaleX;
floorplanMC.scaleY=prevScaleY;
}
if(event.scaleX < 1.1 && floorplanMC.scaleX < 1){
floorplanMC.scaleX=prevScaleX;
floorplanMC.scaleY=prevScaleY;
}
if(event.scaleY < 1.1 && floorplanMC.scaleY < 1){
floorplanMC.scaleX=prevScaleX;
floorplanMC.scaleY=prevScaleY;
}
mat=floorplanMC.transform.matrix.clone();
MatrixTransformer.matchInternalPointWithExternal(mat,internalPoint,externalPoint);
floorplanMC.transform.matrix=mat;
}
function dragStartFloorplan(e:MouseEvent):void
{
myTimerModel.stop();
myTimerModel.reset();
myTimerModel.start();
if(floorplanMC.scaleX > 1 && floorplanMC.scaleY > 1)
{
floorplanMC.startDrag(false, new Rectangle(0,500,-floorplanMC.width + stage.stageWidth, -floorplanMC.height + 1187));
}
}
function dragEndFloorplan(e:MouseEvent):void
{
myTimerModel.stop();
myTimerModel.reset();
myTimerModel.start();
floorplanMC.stopDrag();
}
解决方案
这些事件只会触发您的 SWF 中具有背景的部分。 Transparent 地区不会触发事件。
一个简单的解决方案是在 child SWF 中绘制一个精灵层。
var bg:Sprite = new Sprite();
bg.graphics.beginFill(0xFFFFFF);
bg.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight)
bg.graphics.endFill();
addChild(bg);
示范[=27=]
为了演示,我们将创建两个 .swf
文件。第一个(child)只有一系列条形图。没有任何事件侦听器。
// Child.swf
var size:Number = 50;
for (var i:int = 0; i < stage.stageWidth/(size*2); i++) {
var box:Sprite = new Sprite();
box.graphics.beginFill(0x008cc6);
box.graphics.drawRect(0, 0, size, stage.stageHeight)
box.graphics.endFill();
addChild(box);
box.x = i * (size*2);
}
第二个(parent)加载 child 并将侦听器附加到加载器(我们的 swf 的最顶层容器)。如果你点击一个条,所有的条都会变成绿色。但是,请注意单击条形之间的空白不会产生任何结果。
// Parent.swf
import flash.display.Loader;
import flash.events.MouseEvent;
import flash.display.Sprite;
import fl.motion.Color;
var loader:Loader = new Loader();
loader.load(new URLRequest("child.swf"));
addChild(loader);
loader.addEventListener("mouseDown", cursor);
loader.addEventListener("mouseUp", cursor);
function cursor(e:MouseEvent):void {
var box:Sprite = e.target as Sprite;
var c:Color = new Color();
if (box != null) {
switch (e.type) {
case "mouseDown":
c.setTint(0x00d719, 1);
loader.transform.colorTransform = c;
break;
case "mouseUp":
c.setTint(0x00, 0);
loader.transform.colorTransform = c;
break;
}
}
}
现在让我们用解决方案中提供的后台代码重新编译child。这是修改后的 child 代码。
// Child
var bg:Sprite = new Sprite();
bg.graphics.beginFill(0xFFFFFF);
bg.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight)
bg.graphics.endFill();
addChild(bg);
var size:Number = 50;
for (var i:int = 0; i < stage.stageWidth/(size*2); i++) {
var box:Sprite = new Sprite();
box.graphics.beginFill(0x008cc6);
box.graphics.drawRect(0, 0, size, stage.stageHeight)
box.graphics.endFill();
addChild(box);
box.x = i * (size*2);
}
编译 parent,您会注意到单击任意位置(包括栏之间)都会生成事件。