絵画プログラムを想像してみてください。2つの画像が重なり合っています。上の画像の透明部分をクリックすると、後ろの画像をクリックできるはずです。
各画像にイベントリスナーを追加します。したがって、最初のクリックイベントをディスパッチして、背後のクリックイベントをディスパッチしないようにする必要があります。
(つまり、私はすでに透明なピクセルをチェックしていますが、他の画像にそのイベントをキャンセルすることはできません。)
絵画プログラムを想像してみてください。2つの画像が重なり合っています。上の画像の透明部分をクリックすると、後ろの画像をクリックできるはずです。
各画像にイベントリスナーを追加します。したがって、最初のクリックイベントをディスパッチして、背後のクリックイベントをディスパッチしないようにする必要があります。
(つまり、私はすでに透明なピクセルをチェックしていますが、他の画像にそのイベントをキャンセルすることはできません。)
いくつかの汚い解決策があります。「画像」がスプライトにカプセル化されているとしましょう。そうしないと、リスナーをビットマップオブジェクトまたはシェイプオブジェクトにアタッチできません。MovieClips-アルファのチェックははるかに難しいですが、それでも機能するはずです。リスナーはそれらのスプライトに接続されています。まず、そのスプライト自体が透明度をチェックし、透明でない場合はイベントを続行できます。背後にあるものを取得するには、を呼び出すことができますstage.getObjectsUnderPoint()
。これにより、前景が上にあるDisplayObjectの配列が返されます。したがって、これを呼び出してポイントの下にあるものを列挙する単一のリスナーがあり、RomanTrofimovがそのオブジェクトの透明度を決定するようにアドバイスするようにします。不透明なオブジェクトを見つけたら、次のようにします。
// "b" is a non-transparent DisplayObject found beforehand
while (b && (!(b is InteractiveObject))) b = b.parent;
if (b) {
var p:Point = new Point(e.stageX, e.stageY);
p = b.globalToLocal(p);
b.dispatchEvent(new MouseEvent('click', true, true, p.x, p.y));
}
これにより、イベントを受信できるオブジェクトにクリックイベントがディスパッチされ、背景が不明瞭になるほど不透明になります。
通常、最初のスプライトから常に最初のイベントを取得します(キャプチャフェーズまたは優先度の変更でない場合)。しかし、私が理解しているように、それが透過的であるかどうかを確認する必要があります。そうでない場合は、このイベントのバブリングを停止します。
イベントを停止するには-event.stopImmediatePropagation()
イベントハンドラーで使用します。
透明度を決定するには:
1)ビットビットが1つだけの場合は.bitmapData
、メソッド.getPixel32
で確認できます。アルファ値が返されます。
2)スプライト(ベクターとビットマップ)を組み合わせた場合は、を使用して手動でビットマップにレンダリングしてBitmapData.draw
から、2番目のケースのソリューションを使用する必要があります
3)絶対にミスクリックであったかどうかを理解するには、次の方法を試すことができます。透明度を確認する
MovieClipプロパティ'mouseEnabled'は、クリックイベントが他のオブジェクトの前にあるオブジェクトでトリガーされるのを防ぐことができます。たとえば、同じサイズで同じ位置の2つのムービークリップを取得します。
mc1.addEventListener(MouseEvent.CLICK, click1);
function click1(e:MouseEvent) : void
{
trace("1");
}
mc2.addEventListener(MouseEvent.CLICK, click2);
function click2(e:MouseEvent) : void
{
trace("2");
}
mc1.mouseEnabled = false;
クリックは基本的にmc1を通過するため、出力は「2」になります。
flexでは、mouseEnabledWhereTransparent="false"をコンポーネントに追加できます。ただし、その変数が使用可能かどうかは完全にはわかりません