想象一个绘画程序。我有两个相互重叠的图像。如果我点击上面图片的透明部分,我必须能够点击后面的图片。
我在每个图像上添加了一个事件侦听器。所以我必须阻止第一个发送点击事件,以便后面的发送它。
(我的意思是,我已经检查了透明像素,但我无法取消该事件以发送给其他图像。)
想象一个绘画程序。我有两个相互重叠的图像。如果我点击上面图片的透明部分,我必须能够点击后面的图片。
我在每个图像上添加了一个事件侦听器。所以我必须阻止第一个发送点击事件,以便后面的发送它。
(我的意思是,我已经检查了透明像素,但我无法取消该事件以发送给其他图像。)
有一些肮脏的解决方案。假设您的“图像”封装在 Sprites 中,否则您无法将侦听器附加到 Bitmap 对象或 Shape 对象。MovieClips - 嗯,应该仍然可以工作,虽然检查 alpha 要困难得多。您将听众附加到这些精灵上。首先,该精灵本身可以检查透明度,如果不透明,则继续该事件。要了解后面的内容,您可以调用stage.getObjectsUnderPoint()
,这将返回一个 DisplayObjects 数组,前景位于顶部。因此,您可能只有一个侦听器会调用它来枚举重点内容,然后按照 Roman Trofimov 的建议来确定该对象的透明度。一旦你找到一个不透明的物体,你可以:
// "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));
}
这将向能够接收事件的对象分派一个点击事件,并且足够不透明以掩盖背景。
在 flex 中,您可以将 mouseEnabledWhereTransparent="false" 添加到组件中。不完全确定该变量是否对您可用
MovieClip 属性 'mouseEnabled' 可以防止点击事件在其他对象前面的对象上触发,例如,取两个相同大小和相同位置的影片剪辑:
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;
输出将是“2”,因为点击基本上会“通过”mc1。
通常,您总是会从第一个精灵获得第一个事件(如果它不是捕获阶段或优先级更改)。但据我了解,您需要检查它是否透明,如果不是,请停止冒泡此事件。
停止事件 -event.stopImmediatePropagation()
在事件处理程序中使用。
要确定透明度:
1)如果它只是一个位图,你可以.bitmapData
用方法检查它.getPixel32
,它会返回你的alpha值。
2)如果是组合精灵(矢量和位图),则需要手动将其渲染为位图BitmapData.draw
,然后使用第二种情况的解决方案
3)要了解是否是绝对错过点击,你可以试试这个方法:检查透明度