所以我正在尝试构建一个工具,允许我和其他用户都打开相同的.swf,然后我作为管理员用户能够与我的互动,同时他们都看到我的鼠标移动和按钮点击等等。
我正在使用BlazeDS来管理这个,我正在收集来回发送的数据等等 - 没有困难。我遇到的问题是:
在“Admin”实例中,我单击一个按钮。我捕获了X和Y,然后告诉Blaze告诉我的客户在X和Y发送一个Click事件。在我的客户端,我得到那些数据并在那个X和Y发送一个Click事件 - 但是点击实际上是在阶段级别捕获的。我的客户端上的点击发生在我的所有按钮和其他内容之下 - 所以整个事情都失败了。
这有意义吗?有没有办法告诉它在顶部开始点击事件?
答案 0 :(得分:1)
如果你无法构建加载的swf以使用更好的架构,你可以尝试一些更加苛刻的东西让按钮工作。
查看DisplayObjectContainer的方法getObjectsUnderPoint
和areInaccessibleObjectsUnderPoint
。结合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
)而发生的事情,然后让管理员在调用该函数之前发送一条消息。在客户端等待任何触发器,并将其映射到同一个函数。