Apache flex Flash:如何在加载的.swf文件的顶部调度click事件?
因此,我正在尝试构建一个工具,允许我和其他用户都打开相同的.swf,然后我作为管理员用户能够与我的用户交互,同时他们都可以看到我的鼠标移动和按钮点击等 我正在使用BlazeDS来管理这个,我正在来回发送数据,等等-没有任何困难。我遇到的问题是: 在“Admin”实例中,我单击一个按钮。我捕捉到X和Y,然后告诉Blaze让我的客户在X和Y发送一个点击事件。在我的客户端,我获取数据并在X和Y处发送一个点击事件-但点击实际上是在阶段级别捕获的。在我的客户端上的点击发生在我的所有按钮和其他内容下-因此整个过程失败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处发送一个点击事件-但点击实际上是在阶段级别捕获的。在我的客户端上的点击发生在我的所有按钮和其他内容下-因此整
这有意义吗?有没有办法告诉它从顶部开始单击事件?听起来,在调度单击事件之前,您需要将焦点设置到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。这有意义吗?我想这正是我需要的。让我把它连接起来,看看进展如何,谢谢!要始终如一地实现这一点仍然有点棘手,但这个答案是正确的。谢谢,接受。