0

クイック サマリー

ユーザーがクロムレス ビデオ プレーヤー インスタンスの「空のスペース」をクリックしたとき (つまり、プレーヤーが反応しないクリック) を検出するアクション スクリプトの方法はありますか? これは、クロムレス プレーヤーがオーバーレイ広告を表示している場合に特に重要です。

そうでない場合、ユーザーがオーバーレイ広告をクリックしたり閉じたりしたことを検出する方法はありますか?


詳細

Flash ベースのアプリケーションでは、ビデオ ウィンドウでの「空の」マウス クリックを、特定のアクションのトリガーとして解釈する必要があります。この動作は、YouTube の「フル」フラッシュ プレーヤーで実証されています。それ以外の場合はアクションを呼び出さない「空の領域」をクリックすると、一時停止と再生が切り替わり、空の領域をダブルクリックすると、ウィンドウとフルスクリーンが切り替わります。 .

これは、自己ホスト型コンテンツの再生中は非常に簡単です。ビデオ ウィンドウのクリックはすべて空のクリックであり、適切に動作すると想定できます。

ただし、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 に答える