禁用对子项的鼠标检测但保留在父项上
Posted
技术标签:
【中文标题】禁用对子项的鼠标检测但保留在父项上【英文标题】:Disabling mouse detection on child but remaining on parent 【发布时间】:2019-10-01 01:42:46 【问题描述】:我动态添加了一个影片剪辑。在某些时候,我绘制了动画剪辑并将位图放置在 MC 内的 MC 中,并为其添加了一个添加过滤器。后来我给这样的父动画剪辑提供了拖动功能。我希望鼠标检测除绘制的位图之外的所有内容。我已经将包含位图的影片剪辑设置为 mouseEnabled false & mouseChildren false。但是位图仍然被鼠标检测到。当我将父级设置为 mouseEnabled = false 时,父级不再拖动,因此不起作用。当我将父级设置为 mouseChildren = false 时,没有任何变化,仍然可以感知位图。如何让绘制的位图可见,但让拖动功能忽略 MC 封装的位图?
【问题讨论】:
只是一个想法。将位图(或其具有 mouseChildren = false 的容器)的 name 设置为特定的内容。像“NoMouse”。然后在鼠标事件处理程序中忽略事件 if (e.target.name == "NoMouse"),其中 e 是处理程序参数。 您是说希望子位图保持锁定在同一屏幕位置,即使其父 MC 正在被鼠标移动? @VC.One 重点是实体对象可以禁用鼠标交互,但当鼠标与对象交互时,其父对象仍会调度鼠标事件。 @VC.One 不,我希望整个包都是可拖动的,包括位图。我只是不希望位图对鼠标敏感,因为它的 90% 是一个巨大的透明框,远远超出了眼睛所感知的可交互对象。 那么,你需要使用这个方法:help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/… 请注意Stage坐标空间(就像hitTestPoint)而不是局部坐标。因此,您将获得位于 (mouseX, mouseY) 位置下的子项列表,如果列表中有位图及其容器以外的对象,则允许事件发生,类似的事情。 【参考方案1】:所以,经过一番讨论,我们得出以下结论:
-
由于显示列表层次结构,直接使用鼠标播放不是正确的方法。
答案在DisplayObjectContainer.getObjectsUnderPoint(...) 方法中,它返回一个Array,其中包含给定DisplayObjectContainer 的直接在给定点下的子孙。使用 Mouse 坐标作为点(请记住,您需要在 Stage 坐标空间中提供坐标,就像使用 hitTestPoint) 您可以在 鼠标 指针下获取显示对象列表,然后根据该信息处理鼠标事件。
在此过程中还有一个问题是确定收集的对象的类,解决方案非常简单。
// We are in the root here.
addEventListener(MouseEvent.MOUSE_DOWN, onDown);
function onDown(e:MouseEvent):void
var aPoint:Point = localToGlobal(new Point(mouseX, mouseY));
var aList:Array = getObjectsUnderPoint(aPoint);
// Lets browse through all the results.
for each (var aChild:DisplayObject in aList)
// How to find if an object is an instance of certain Class.
if (aChild is Shape)
trace("A Shape was found under a name of", aChild.name, "!!!");
【讨论】:
@VC.One 谦卑地鞠躬 我得到这个完全工作,谢谢!如果它对任何人都有帮助,我必须添加一个计数器,因为它还将背景捕获为一个形状,因此,只计算具有 2 个以上形状的点击次数。然后我必须添加一个长 if 语句来尝试推断目标的路径,以便知道它来自哪个父级,知道要开始拖动哪个父级(在这种情况下,MC 有很多嵌套所以很多可能的目标和路径) @ola.rogula 很高兴它有帮助:)以上是关于禁用对子项的鼠标检测但保留在父项上的主要内容,如果未能解决你的问题,请参考以下文章