【发布时间】:2009-04-20 20:38:42
【问题描述】:
观察到的行为:
- 我有一个 UI 页面滑到屏幕上。
- 幻灯片完成后,激活按钮。
- 如果鼠标已经悬停在按钮上,则不会发生翻转(因为从技术上讲,MOUSE_OVER 没有发生)
期望的行为: 1、2 相同,但在 3 上,我看到了我的翻转。
除了蛮力之外,还有什么方法可以轻松做到这一点,比如跟踪鼠标并将其位置与所有按钮的暗淡进行比较?
谢谢!
【问题讨论】:
标签: flash actionscript-3
观察到的行为:
期望的行为: 1、2 相同,但在 3 上,我看到了我的翻转。
除了蛮力之外,还有什么方法可以轻松做到这一点,比如跟踪鼠标并将其位置与所有按钮的暗淡进行比较?
谢谢!
【问题讨论】:
标签: flash actionscript-3
您可以使用当前鼠标位置的 x 和 y 坐标向最顶部的容器发送 mouseMove 事件。这将模拟用户移动鼠标的效果。
private function moveComplete():void
{
topLevelContainer.dispatchEvent(new MouseEvent(MouseEvent.MOUSEMOUSE, true, false, topLevelContainer.mouseX, topLevelContainer.mouseY);
}
【讨论】:
在按钮初始化时,我设置了私有变量 _bounds:
_bounds = getBounds(this);
在激活时,我调用:
if (isMouseOver()) doOver(true);
然后是函数:
private function isMouseOver():Boolean {
//trace ("isMouseOver:");
var xBool:Boolean = _bounds.left < mouseX && mouseX < _bounds.right;
var yBool:Boolean = _bounds.top < mouseY && mouseY < _bounds.bottom;
//trace (" - xBool: " + xBool);
//trace (" - yBool: " + yBool);
return xBool && yBool;
}
【讨论】:
您可以为鼠标悬停处理程序设置默认参数,因此您不需要 创建和调度一个新事件来运行相同的代码。
例如
myBtn.addEventListener(MouseEvent.MOUSE_OVER, btnOverHandler);
function btnOverHandler(e:MouseEvent = null):void{
trace('do stuff on roll over!');
}
//then you can do this wherever you need
btnOverHandler();
它应该在两种情况下都有效(鼠标事件,或者不)。
对于鼠标悬停的东西,getObjectsUnderPoint 可以很方便。它超出了您对这个特定示例的需要(而且有点冗长),但知道它的存在是件好事。
例如
function isMouseOver(target:DisplayObject,container:DisplayObjectContainer):Boolean{
var isOver:Boolean = false;
var pt:Point = new Point(mouseX, mouseY);
var objects:Array = container.getObjectsUnderPoint(pt);
for(var i:int = 0 ; i < objects.length; i++){
if(objects[i] == target) {
isOver = true;
break;
}
}
return isOver;
}
希望这会有所帮助。
【讨论】:
当 UI 向下滑动时,您可以更改以下属性,
slidingUI.mousenabled = false
slidingUI.mousechildren = false
这将在组件滑动时启用下方按钮的翻转事件。请务必在之后将属性重置为 true。 不确定这是否是您想要的,但它可能会派上用场。
【讨论】: