1

想象一个绘画程序。我有两个相互重叠的图像。如果我点击上面图片的透明部分,我必须能够点击后面的图片。

我在每个图像上添加了一个事件侦听器。所以我必须阻止第一个发送点击事件,以便后面的发送它。

(我的意思是,我已经检查了透明像素,但我无法取消该事件以发送给其他图像。)

4

4 回答 4

1

有一些肮脏的解决方案。假设您的“图像”封装在 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)); 
}

这将向能够接收事件的对象分派一个点击事件,并且足够不透明以掩盖背景。

于 2012-09-17T14:11:35.597 回答
0

在 flex 中,您可以将 mouseEnabledWhereTransparent="false" 添加到组件中。不完全确定该变量是否对您可用

于 2012-09-17T13:45:39.113 回答
0

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。

于 2012-09-17T13:34:20.670 回答
0

通常,您总是会从第一个精灵获得第一个事件(如果它不是捕获阶段或优先级更改)。但据我了解,您需要检查它是否透明,如果不是,请停止冒泡此事件。

停止事件 -event.stopImmediatePropagation()在事件处理程序中使用。

要确定透明度:

1)如果它只是一个位图,你可以.bitmapData用方法检查它.getPixel32,它会返回你的alpha值。

2)如果是组合精灵(矢量和位图),则需要手动将其渲染为位图BitmapData.draw,然后使用第二种情况的解决方案

3)要了解是否是绝对错过点击,你可以试试这个方法:检查透明度

于 2012-09-17T13:56:04.927 回答