代码之家  ›  专栏  ›  技术社区  ›  Myk

flash:如何在加载的.swf的顶部发送点击事件?

  •  0
  • Myk  · 技术社区  · 14 年前

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

    我正在使用Blazeds来管理这个问题,我得到了来回发送的数据等等——在那里没有困难。我遇到的问题是:

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

    这有道理吗?有没有方法告诉它从顶部开始点击事件?

    3 回复  |  直到 14 年前
        1
  •  1
  •   James Fassett    14 年前

    如果您无法构建加载的SWF以使用更好的体系结构,您可以尝试一些更具黑客风格的方法来让按钮工作。

    看看这些方法 getObjectsUnderPoint areInaccessibleObjectsUnderPoint DisplayObjectContainer . 结合 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));
        }
    }
    

    在每个点上都无法访问对象 如果您认为它们可能是安全限制(例如跨域问题),那么这一点很重要,因此如果出现问题,您可以进行调试。

    另外请注意,您可能希望(或需要)填写 MouseEvent (例如正确的目标、本地X、本地YY等)

        2
  •  0
  •   JeffryHouser    14 年前

    听起来,在分派Click事件之前,您需要将焦点设置到x和y位置的最上面的部分。

    也就是说,我想知道这种情况下的用例是什么;与使用屏幕共享工具(如connect)相反。

        3
  •  0
  •   James Fassett    14 年前

    这似乎是一个糟糕的方法来实现你正在尝试做的事情。如果你在管理工具中“点击”,你可能是 事实上 触发一些事件。为什么不触发该事件而不发送鼠标点击?

    我只需要保留一个操作的映射,然后当管理界面中发生什么事情时,将键发送到该操作。

    例如

    在管理员:

    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 )然后让管理员在调用该函数之前发送一条消息。在客户端等待 任何 通过并将其映射到同一函数的触发器。