如何设置鼠标单击不要点击透明像素

时间:2012-09-17 13:06:33

标签: actionscript-3 flex

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

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

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

4 个答案:

答案 0 :(得分:1)

有一些肮脏的解决方案。说出你的"图像"被封装在Sprite中,否则您无法将侦听器附加到Bitmap对象或Shape对象。 MovieClips - 嗯,应该仍然有用,虽然检查alpha要困难得多。你有你的听众附加那些精灵。首先,该sprite本身可以检查透明度,如果不透明,则继续该事件。要获得后面的内容,可以调用stage.getObjectsUnderPoint(),这将返回一个DisplayObjects数组,前景位于顶部。因此,您可能只有一个单独的监听器,可以将其称为枚举点下的内容,然后按照罗马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)); 
}

这会将点击事件发送给能够接收事件的对象,并且不够透明以遮挡背景。

答案 1 :(得分: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。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

通常,您将始终从第一个精灵获得第一个事件(如果它不是捕获阶段或优先级更改)。但据我了解,你需要检查它是否透明,如果没有 - 停止冒泡这个事件。

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

确定透明度:

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

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

3)要了解是否绝对错过点击,您可以尝试以下方法:Check transparency