Flash:如何在加载的.swf顶部调度click事件?

时间:2010-06-15 19:19:45

标签: flex flash actionscript-3

所以我正在尝试构建一个工具,允许我和其他用户都打开相同的.swf,然后我作为管理员用户能够与我的互动,同时他们都看到我的鼠标移动和按钮点击等等。

我正在使用BlazeDS来管理这个,我正在收集来回发送的数据等等 - 没有困难。我遇到的问题是:

在“Admin”实例中,我单击一个按钮。我捕获了X和Y,然后告诉Blaze告诉我的客户在X和Y发送一个Click事件。在我的客户端,我得到那些数据并在那个X和Y发送一个Click事件 - 但是点击实际上是在阶段级别捕获的。我的客户端上的点击发生在我的所有按钮和其他内容之下 - 所以整个事情都失败了。

这有意义吗?有没有办法告诉它在顶部开始点击事件?

3 个答案:

答案 0 :(得分:1)

如果你无法构建加载的swf以使用更好的架构,你可以尝试一些更加苛刻的东西让按钮工作。

查看DisplayObjectContainer的方法getObjectsUnderPointareInaccessibleObjectsUnderPoint。结合hasEventListener,你应该能够模仿你想要的东西。

这是一些未经测试的伪代码:

function detectClick(pt:Point):void
{
    var objsUnderPoint:Array = containerStage.getObjectsUnderPoint(pt);
    var clickable:Array = [];
    for each(dispObj:DisplayObject in objsUnderPoint)
    {
        if(dispObj.hasEventListener(MouseEvent.CLICK))
        {
            clickable.push(dispObj);
        }
    }

    if(clickable.length)
    {
         // sort on depth here
         // that might be tricky since you'll be looking at grandchildren
         // and not just children but it is doable.
         var topMostClickable:DisplayObject = ???
         topMostClickable.dispatchEvent(new MouseEvent(MouseEvent.CLICK, true, false));
    }
}

areInaccessibleObjectsUnderPoint非常重要,如果您认为它们可能是安全限制(例如跨域问题),那么您可以在出现问题时进行调试。

另请注意,您可能希望(或需要)填写MouseEvent的更多详细信息(如正确的目标,localX,localyY等)。

答案 1 :(得分:0)

在发送点击事件之前,您需要将焦点设置为x和y位置的最顶层组件。

那就是说,我想知道这个用例是什么用例;而不是使用Connect等屏幕共享工具。

答案 2 :(得分:0)

这似乎是一种实施您想要做的事情的糟糕方式。如果您在管理工具中“单击”,则可能实际触发某些事件。为什么不触发该事件而不是发送鼠标点击?

我只保留一个操作地图,然后当Admin界面中发生某些事情时,将该键发送给该操作。

e.g。

在管理员:

myButton.addEventListener(MouseEvent.CLICK, handleClickButton);

function handleClickButton(event:MouseEvent):void
{
    doSomeAction();
    sendTriggerToClient(MyActions.SOME_TRIGGER);
}

在客户端:

var actionMap:Object = {};
actionMap[MyActions.SOME_TRIGGER] = doSomeAction;

function receiveTriggerFromAdmin(trigger:String):void
{
    var responseFunc:Function = actionMap[trigger];
    responseFunc();
}

我希望伪代码有意义。只是抽象一下因单击一个单独的函数(doSomeAction)而发生的事情,然后让管理员在调用该函数之前发送一条消息。在客户端等待任何触发器,并将其映射到同一个函数。