Actionscript 3 如何设置鼠标单击不命中透明像素

Actionscript 3 如何设置鼠标单击不命中透明像素,actionscript-3,apache-flex,Actionscript 3,Apache Flex,想象一个绘画程序。我有两张相互重叠的照片。如果我点击上面的透明部分,我必须能够点击后面的图片 我在每个图像上添加一个事件侦听器。所以我必须阻止第一个调度click事件,以便后面的一个调度它 (我的意思是,我已经检查了透明像素,但我无法取消该事件到另一个imagem分派它。)MovieClip属性“mouseEnabled”可以防止在其他对象前面的对象上触发单击事件,例如,拍摄两个大小和位置相同的电影剪辑: mc1.addEventListener(MouseEvent.CLICK, click1

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

我在每个图像上添加一个事件侦听器。所以我必须阻止第一个调度click事件,以便后面的一个调度它


(我的意思是,我已经检查了透明像素,但我无法取消该事件到另一个imagem分派它。)

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。

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。

在flex中,您可以向组件添加mouseEnabledWhereTransparent=“false”。虽然在flex中可以向组件添加mouseEnabledWhereTransparent=“false”,但不能完全确定该变量是否可用。不完全确定该变量是否对您可用,但通常,您将始终从第一个精灵获取第一个事件(如果不是捕获阶段或优先级更改)。但据我所知,你需要检查它是透明的,如果不是的话,停止冒泡这个事件

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

为确定透明度:

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

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


3) 要了解是否完全未点击,您可以尝试以下方法:

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

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

为确定透明度:

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

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


3) 要了解是否完全没有点击,您可以尝试以下方法:

有一些肮脏的解决方案。假设“图像”封装在精灵中,否则无法将侦听器附加到位图对象或形状对象。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)); 
}

这将向能够接收事件的对象发送一个click事件,并且不透明到足以掩盖背景

有一些肮脏的解决方案。假设“图像”封装在精灵中,否则无法将侦听器附加到位图对象或形状对象。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)); 
}

这将向能够接收事件的对象发送一个click事件,并且不透明到足以掩盖背景

也许使用地图区域而不是IMG,比如谷歌地图工作。用IMAGE Maybe使用图像区域,而不是IMG,像谷歌地图工作。用IMAGE来掩饰图像将把这个答案看作是对我的情况最好的证明,因为它对我有帮助。我会把这个答案看作是对我的最好的证明。因为它总体上帮助了我。