当覆盖广告显示时,检测点击Chromeless Youtube播放器中的空白区域

时间:2012-09-19 06:52:13

标签: actionscript-3 youtube-api

快速摘要

在actionscript中是否有办法检测用户何时点击无边框视频播放器实例中的“空白空间”(即不会引起玩家反应的点击)?当无边框播放器显示重叠式广告时,这一点尤为重要。

如果没有,是否有办法在用户点击或关闭重叠式广告时检测到?


详细

我的基于Flash的应用程序需要将视频窗口上的“空”鼠标单击解释为特定操作的触发器。在youtube的“完整”Flash播放器中演示了这种行为 - 单击“空白区域”,否则会在暂停和播放之间切换操作,并双击空白区域在窗口和全屏之间切换

在播放自托管内容时这很简单 - 我可以假设视频窗口上的任何点击都是空的,并且可以采取适当的行动。

然而,当我正在播放YouTube视频时,,因为它可以在视频内容上弹出叠加广告。我需要允许用户与广告进行互动,但仍然让我的应用程序的逻辑处理点击无边框播放器的“空”区域。

我花了很多年时间试图解决这个问题,并没有取得任何进展。该文档不包括此内容。在响应显示广告或与广告互动时,没有通过onStateChange抛出任何新状态。似乎没有与显示重叠式广告相关联的API更改(不会抛出onApiChange,并且轮询getOptions()没有显示任何内容)。使用getObjectsUnderPoint克服一个解决方法不起作用。我甚至尝试通过轮询Mouse.cursor状态来反向设计信息(当它悬停在无边框播放器中的交互式对象上时,它在视觉上被设置为“手”......但它被设置为“自动”)。

有关如何完成此任务的任何建议?特别是对于无边框播放器是否使用StageVideo透明的方式?

2 个答案:

答案 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;
}