如何处理具有重叠 TextField 的鼠标悬停事件?
How do you handle mouseover events with overlapping TextFields?
我有一排代表选项卡的水平按钮,每个按钮内部都有一个 TextField
,它比按钮的尺寸大,因此它们重叠。像这样(虚线是TextField
,红框是由于重叠而鼠标悬停不起作用的区域):
这些按钮中的每一个都是 TabButton
的实例,它具有如下 class 定义:
package src
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
public class TabButton extends MovieClip
{
// Stage Instances
public var mcHitZone:MovieClip;
public var mcText:TextField;
public function TabButton()
{
super();
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage, false, 0, true);
}
private function onAddedToStage(e:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
// Disable mouse input on everything except for the hit zone since that's where mouse handling should be done.
mcText.mouseEnabled = false;
mcHitZone.addEventListener(MouseEvent.ROLL_OVER, onMouse, false, 0, true);
}
private function onMouse(e:MouseEvent):void
{
trace("Mouse event: " + name + " " + e.type);
}
}
}
每个 TabButton 都有一个 mcHitZone
,我将鼠标处理程序附加到它,这是上图中的黑色区域。由于 TextField
比按钮本身大得多,因此在处理鼠标输入时需要完全忽略它,因此我使用 mcText.mouseEnabled = false;
将其关闭,这似乎在单个按钮内使用鼠标时有效,但是当鼠标悬停在重叠区域(红色框)上时,TextField
将阻止来自另一个按钮的鼠标输入。
有什么方法可以使它工作,以便 TextField
不会阻止鼠标输入与其重叠的任何内容?
我已经上传了 FLA 和 AS,我一直在用 here 测试它。如果您 运行 它,它会在您滑过特定按钮时进行跟踪。如果您尝试将鼠标悬停在最左边按钮的红色区域上,则它将不起作用。
您的按钮有三个影片剪辑、mcHitZone、mcText 和 TabButton 本身。
因此,当您关闭两个按钮时,向上的 tabButton(不是 Child mcText)将影响下方的 tabButton。
我建议你的tabButton不要扩展movieClip,只使用mcHitZone作为Button的皮肤,然后将它添加到你的舞台上。
正如评论所说,您也可以将tabButton 的mouseEnabled 设置为false。我混淆了 mouseEnabled 和 mouseChildren。
我有一排代表选项卡的水平按钮,每个按钮内部都有一个 TextField
,它比按钮的尺寸大,因此它们重叠。像这样(虚线是TextField
,红框是由于重叠而鼠标悬停不起作用的区域):
这些按钮中的每一个都是 TabButton
的实例,它具有如下 class 定义:
package src
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
public class TabButton extends MovieClip
{
// Stage Instances
public var mcHitZone:MovieClip;
public var mcText:TextField;
public function TabButton()
{
super();
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage, false, 0, true);
}
private function onAddedToStage(e:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
// Disable mouse input on everything except for the hit zone since that's where mouse handling should be done.
mcText.mouseEnabled = false;
mcHitZone.addEventListener(MouseEvent.ROLL_OVER, onMouse, false, 0, true);
}
private function onMouse(e:MouseEvent):void
{
trace("Mouse event: " + name + " " + e.type);
}
}
}
每个 TabButton 都有一个 mcHitZone
,我将鼠标处理程序附加到它,这是上图中的黑色区域。由于 TextField
比按钮本身大得多,因此在处理鼠标输入时需要完全忽略它,因此我使用 mcText.mouseEnabled = false;
将其关闭,这似乎在单个按钮内使用鼠标时有效,但是当鼠标悬停在重叠区域(红色框)上时,TextField
将阻止来自另一个按钮的鼠标输入。
有什么方法可以使它工作,以便 TextField
不会阻止鼠标输入与其重叠的任何内容?
我已经上传了 FLA 和 AS,我一直在用 here 测试它。如果您 运行 它,它会在您滑过特定按钮时进行跟踪。如果您尝试将鼠标悬停在最左边按钮的红色区域上,则它将不起作用。
您的按钮有三个影片剪辑、mcHitZone、mcText 和 TabButton 本身。 因此,当您关闭两个按钮时,向上的 tabButton(不是 Child mcText)将影响下方的 tabButton。
我建议你的tabButton不要扩展movieClip,只使用mcHitZone作为Button的皮肤,然后将它添加到你的舞台上。
正如评论所说,您也可以将tabButton 的mouseEnabled 设置为false。我混淆了 mouseEnabled 和 mouseChildren。