0

快速总结

actionscript 中是否有一种方法可以检测用户何时单击无铬视频播放器实例中的“空白空间”(即不会导致播放器做出反应的单击)?当无镶边播放器显示重叠式广告时,这一点尤为重要。

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


细节

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

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

但是,当我播放 youtube 视频时,情况并非如此,因为它可以在视频内容上弹出叠加广告。我需要允许用户与广告交互,但仍然让我的应用程序的逻辑处理对无铬播放器的“空白”区域的点击。

我花了很长时间试图解决这个问题,但没有取得任何进展。文档没有涵盖这一点。没有通过 onStateChange 抛出任何新状态以响应广告的显示或交互。似乎没有与显示重叠广告相关的 API 更改(没有引发 onApiChange,并且轮询 getOptions() 没有出现任何结果)。使用 getObjectsUnderPoint 解决方法不起作用。我什至尝试通过轮询 Mouse.cursor 状态来对信息进行反向工程(当鼠标悬停在无铬播放器中的交互式对象上时,它在视觉上被设置为“手”……但它被设置为“自动”)。

关于如何做到这一点的任何建议?特别是对于无铬播放器是否使用 StageVideo 是透明的?

4

2 回答 2

1

虽然这是 Players API 团队认识到需要改进的地方(通过创建在显示广告或其他叠加层时触发的回调,或者尝试从叠加层返回有关视频播放器的哪个矩形“安全”的信息),目前 API 中没有任何东西可以完成您所追求的。

随时提交功能请求以进行跟踪,如果有任何进展,我们可以保持最新。

于 2012-09-19T21:38:50.440 回答
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;
}
于 2012-09-20T23:21:39.023 回答