actionscript-3 - ActionScript 3 TransformGestureEvent 不适用于 SWF MovieClip

标签 actionscript-3 flash actionscript

大家下午好,

我在舞台上添加了一个 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 中具有背景的部分上触发。透明区域不会触发事件。

一个简单的解决方案是在子 SWF 中绘制一个 Sprite 层。

var bg:Sprite = new Sprite();
bg.graphics.beginFill(0xFFFFFF);
bg.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight)
bg.graphics.endFill();
addChild(bg);

演示

为了进行演示,我们将创建两个 .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);
}

第二个(父级)加载子级并将监听器附加到加载器(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

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);
}

编译父级,您会注意到单击任意位置(包括条之间)都会生成事件。

关于actionscript-3 - ActionScript 3 TransformGestureEvent 不适用于 SWF MovieClip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45357176/

相关文章:

php - JSON.parse 错误 #1132 : Invalid JSON parse input (Flex/Actionscript/PHP)

flash - ActionScript 3 'this' 问题

flash - 无法在 Flash CS4 中导入 UIComponent?

html - 如何使用 Flash 对象作为链接?

apache-flex - 在 Flex 中将字符串拆分为数组

flash - 网络摄像头分辨率检测

php - 如何保护 Flash 游戏中的得分列表

apache-flex - Flex 与 DHTML 有哪些区别?

javascript - 用 Javascript , Jquery 中的字符串替换特定索引处的字符

actionscript-3 - 在as3中分割字符串