簡體   English   中英

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具有背景的部分。 透明區域不會觸發事件。

一種簡單的解決方案是在子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.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);
}

編譯父對象,您會注意到單擊任何地方(包括在條之間)將生成事件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM