在actionscript中是否有办法检测用户何时点击无边框视频播放器实例中的“空白空间”(即不会引起玩家反应的点击)?当无边框播放器显示重叠式广告时,这一点尤为重要。
如果没有,是否有办法在用户点击或关闭重叠式广告时检测到?
我的基于Flash的应用程序需要将视频窗口上的“空”鼠标单击解释为特定操作的触发器。在youtube的“完整”Flash播放器中演示了这种行为 - 单击“空白区域”,否则会在暂停和播放之间切换操作,并双击空白区域在窗口和全屏之间切换
在播放自托管内容时这很简单 - 我可以假设视频窗口上的任何点击都是空的,并且可以采取适当的行动。
然而,当我正在播放YouTube视频时,不,因为它可以在视频内容上弹出叠加广告。我需要允许用户与广告进行互动,但仍然让我的应用程序的逻辑处理点击无边框播放器的“空”区域。
我花了很多年时间试图解决这个问题,并没有取得任何进展。该文档不包括此内容。在响应显示广告或与广告互动时,没有通过onStateChange抛出任何新状态。似乎没有与显示重叠式广告相关联的API更改(不会抛出onApiChange,并且轮询getOptions()没有显示任何内容)。使用getObjectsUnderPoint克服一个解决方法不起作用。我甚至尝试通过轮询Mouse.cursor状态来反向设计信息(当它悬停在无边框播放器中的交互式对象上时,它在视觉上被设置为“手”......但它被设置为“自动”)。
有关如何完成此任务的任何建议?特别是对于无边框播放器是否使用StageVideo透明的方式?
答案 0 :(得分:1)
虽然这是Players API团队认识到需要改进的一个领域(通过创建在展示广告或其他叠加层时触发的回调,或者尝试返回有关视频播放器的矩形的信息是“安全的”) “来自叠加层”,目前在API中没有任何东西能够完成你所追求的目标。
为了跟踪目的,请随意file a feature request,如果发生任何事情,我们可以保持最新状态。
答案 1 :(得分:0)
根据Jeff Posnick的回答(没有官方的方法),我最终使用相当于屏幕抓取的代码拼凑出一个脆弱的解决方案。
在鼠标单击时,我遍历无边框播放器的DisplayObject层次结构,滤除噪声,并查看当前点下是否存在鼠标交互的对象。
它很脆弱 - 未来对无边框播放器的改变很容易打破这个。如果重叠式广告包含AVM1内容,则无法访问该广告并将使用鼠标事件。但它总比没有好。 :(
这里有一些示例代码来演示这个概念。传入无边框播放器的DisplayObject,以及舞台空间中的当前鼠标位置。这将返回该点下面是否有鼠标交互元素,并将跟踪支持的鼠标交互是什么。
private function IsPointInteractive(displayObject:DisplayObject,
stageX:Number,
stageY:Number) : Boolean
{
const className:String = flash.utils.getQualifiedClassName(displayObject);
const container:DisplayObjectContainer = displayObject as DisplayObjectContainer;
if (!displayObject.visible)
return false;
if (className != "com.google.youtube.application::SwfProxy" &&
className != "com.google.youtube.application::VideoApplication" &&
className != "com.google.youtube.players::HTTPVideoPlayer" &&
className != "com.google.youtube.players::TagStreamPlayer" &&
(null == container || container.mouseEnabled) &&
displayObject.hitTestPoint(stageX, stageY, true) )
{
var supports:String = "";
if (displayObject.hasEventListener(MouseEvent.CLICK))
supports += "MouseEvent.CLICK";
if (displayObject.hasEventListener(MouseEvent.DOUBLE_CLICK))
supports += (0 == supports.length ? "" : ", ") + "DOUBLE_CLICK";
if (displayObject.hasEventListener(MouseEvent.MOUSE_DOWN))
supports += (0 == supports.length ? "" : ", ") + "MOUSE_DOWN";
if (displayObject.hasEventListener(MouseEvent.MOUSE_UP))
supports += (0 == supports.length ? "" : ", ") + "MOUSE_UP";
if (0 != supports.length)
{
trace(displayObject + " (" + className + ") [" + supports + "]");
return true;
}
}
if (container && container.mouseChildren)
{
for (var i:int = container.numChildren - 1; i >= 0; i--)
{
if (IsPointInteractive(container.getChildAt(i), stageX, stageY))
return true;
}
}
return false;
}