【问题标题】:Activating a button underneath the mouse: how do you capture the OVER event?激活鼠标下方的按钮:如何捕获 OVER 事件?
【发布时间】:2009-04-20 20:38:42
【问题描述】:

观察到的行为:

  1. 我有一个 UI 页面滑到屏幕上。
  2. 幻灯片完成后,激活按钮。
  3. 如果鼠标已经悬停在按钮上,则不会发生翻转(因为从技术上讲,MOUSE_OVER 没有发生)

期望的行为: 1、2 相同,但在 3 上,我看到了我的翻转。

除了蛮力之外,还有什么方法可以轻松做到这一点,比如跟踪鼠标并将其位置与所有按钮的暗淡进行比较?

谢谢!

【问题讨论】:

    标签: flash actionscript-3


    【解决方案1】:

    您可以使用当前鼠标位置的 x 和 y 坐标向最顶部的容器发送 mouseMove 事件。这将模拟用户移动鼠标的效果。

    private function moveComplete():void
    {
        topLevelContainer.dispatchEvent(new MouseEvent(MouseEvent.MOUSEMOUSE, true, false, topLevelContainer.mouseX, topLevelContainer.mouseY);
    }
    

    【讨论】:

    • 不过,我看不出这对我有什么帮助。如果是 mouseMove,但他们从未离开过交互对象,那我会得到什么?我仍然需要将 x + y 与所有按钮的约束进行比较,对吧?
    • 为什么? topLevelContainer 接收到一个 MOUSE_MOVE 事件,然后它将向下传播给它的子级,即您移动的 UI 按钮。这将在相应的按钮上触发 MOUSE_OVER 事件,并实现翻转效果。
    • 嗯...对不起,cookie,我试过了,但没有骰子。不确定我是否正确实施了它。考虑到鼠标已经在所需的按钮上,我仍然看不到这将如何触发 MOUSE_OVER。还是您的意思是在滑动按钮上添加一个额外的监听器来监听顶层 MOUSE_MOVE?
    • 我想一个解决方法是听 MOUSE_MOVE 然后触发 MOUSE_OVER,不过让我想一个更优雅的解决方案。
    • 该事件将记录下来给孩子们。它会冒泡,而不是向下。
    【解决方案2】:

    在按钮初始化时,我设置了私有变量 _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;
    }
    

    【讨论】:

      【解决方案3】:

      您可以为鼠标悬停处理程序设置默认参数,因此您不需要 创建和调度一个新事件来运行相同的代码。

      例如

      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;
      }
      

      希望这会有所帮助。

      【讨论】:

        【解决方案4】:

        当 UI 向下滑动时,您可以更改以下属性,

        slidingUI.mousenabled = false
        slidingUI.mousechildren = false
        

        这将在组件滑动时启用下方按钮的翻转事件。请务必在之后将属性重置为 true。 不确定这是否是您想要的,但它可能会派上用场。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多