Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex Flash:如何在加载的.swf文件的顶部调度click事件?_Apache Flex_Flash_Actionscript 3 - Fatal编程技术网

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

Apache flex Flash:如何在加载的.swf文件的顶部调度click事件?,apache-flex,flash,actionscript-3,Apache Flex,Flash,Actionscript 3,因此,我正在尝试构建一个工具,允许我和其他用户都打开相同的.swf,然后我作为管理员用户能够与我的用户交互,同时他们都可以看到我的鼠标移动和按钮点击等 我正在使用BlazeDS来管理这个,我正在来回发送数据,等等-没有任何困难。我遇到的问题是: 在“Admin”实例中,我单击一个按钮。我捕捉到X和Y,然后告诉Blaze让我的客户在X和Y发送一个点击事件。在我的客户端,我获取数据并在X和Y处发送一个点击事件-但点击实际上是在阶段级别捕获的。在我的客户端上的点击发生在我的所有按钮和其他内容下-因此整

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

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

在“Admin”实例中,我单击一个按钮。我捕捉到X和Y,然后告诉Blaze让我的客户在X和Y发送一个点击事件。在我的客户端,我获取数据并在X和Y处发送一个点击事件-但点击实际上是在阶段级别捕获的。在我的客户端上的点击发生在我的所有按钮和其他内容下-因此整个过程失败


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

听起来,在调度单击事件之前,您需要将焦点设置到x和y位置的最顶部组件


也就是说,我想知道这样的东西的用例是什么;与使用诸如Connect之类的屏幕共享工具不同

这似乎是一种很糟糕的方法,无法实现您要做的事情。如果你在管理工具中“点击”,你可能实际上触发了一些事件。为什么不触发该事件而不是发送鼠标单击

我只需要保留一个动作图,然后当管理界面中发生了什么事情时,发送动作的键

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

如果您无法构建加载的swf以使用更好的架构,您可以尝试一些更黑客的方法来让按钮工作

请查看的方法
getObjectsDerpoint
areinaccessibleObjectsDerpoint
。结合
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));
    }
}
AreUnaccessibleObjectsDerpoint
如果您认为它们可能是安全限制(例如跨域问题),则非常重要,这样您就可以在出现问题时进行调试


还请注意,您可能希望(或需要)填写更多的详细信息(如适当的目标、localX、localyY等)

这是一个具有特定要求的内部工具。你说的聚焦是什么意思?我正在尝试执行myLoadedSWF.dispatchEvent()等-你是说我需要反思已加载的.swf并在实际按钮上调度事件等我希望截获它?我不确定如何解释焦点。具有焦点的元素是处于活动状态的元素。你应该试着在FocusManager上设置聚焦,然后在聚焦对象上分派适当的事件。是的,这不是我需要的。Focus非常适合切换,但我需要在管理员和客户端之间复制1:1的鼠标事件。您最初的问题是,在您单击“服务器”后,事件在“客户端”的阶段级别被捕获。我怀疑——现在仍然如此——您的“客户机”正在从错误的组件调度“服务器”事件。也许你需要一个“coordinatesToObject”函数。如果由我决定,我们将在加载到此工具的所有资产上进行完整的MVC集成-然后我们只需将模型同步到中央服务器,将状态绑定到该模型,并且只允许管理员向其写入更新。不幸的是,这个工具需要支持大量已经编写的.swf文件。我希望避免进入并将其所有现有内容重新配置为良好的体系结构。这意味着一个工具,允许某人一次向任意数量的客户端演示他们的任何一个应用程序。所以,是的,这个想法不错,但不幸的是并不能解决这个问题。更具体地说,客户端和管理员实际上是同一个应用程序。我只是有一个“管理员”的标志,我在一个我想用来广播触发。我必须能够使用它来加载任何.swf。这有意义吗?我想这正是我需要的。让我把它连接起来,看看进展如何,谢谢!要始终如一地实现这一点仍然有点棘手,但这个答案是正确的。谢谢,接受。