【问题标题】:AS3: What is the best way to put button-behaviors ONLY on child_mcs of a container_mcAS3:将按钮行为仅放在 container_mc 的 child_mcs 上的最佳方法是什么
【发布时间】:2015-05-23 13:08:10
【问题描述】:

我有一个container_mc,里面有很多 child_mcs。我希望 child_mcs 具有完整的类似按钮的行为(可点击、光标效果)。

我对给每个孩子设置单独的鼠标监听器不感兴趣。 ...我只想在父容器上设置一个侦听器,尽管父容器实际上处于非活动状态...只有 child_mcs。

【问题讨论】:

    标签: actionscript-3 flash button event-bubbling event-propagation


    【解决方案1】:

    定义类中按钮的常见行为,并将该类与库中的按钮符号相关联。

    【讨论】:

    • 但我相信我需要在那个 mc 类中放置一个事件监听器......因此 mc 的每个实例都会有效地创建一个唯一的监听器实例......
    • 您不为每个按钮设置监听器的动机是什么?按钮的光标效果是属于该按钮的功能。此外,没有“听众的实例”之类的东西。事件系统只是要调用的函数引用列表。
    • 如果监听器在 mc 类中,那么 mc 的每个实例都会注册一个唯一的监听器......但否则这是一个很好的策略......
    【解决方案2】:

    您可以在将useCapture 标志设置为trueaddEventListener 的第三个参数)的容器上侦听click 事件 - 每次任何容器的子级(包括孙子级等)时都会调用侦听器on) 被点击。然后,您可以检查单击了哪个按钮,例如通过检查其name 属性。

    【讨论】:

      【解决方案3】:

      假设你有这样的东西:

      var container_mc:Sprite = new Sprite();
      addChild(container_mc);
      
      container_mc.addChild(button1);
      container_mc.addChild(button2);
      //and so forth with all your buttons
      

      按照您的要求,您将执行以下操作:

      //add a click listener to the container
      container_mc.addEventListener(MouseEvent.CLICK,click);
      
      //make the buttonMode true on the container, so you get the button hand cursor
      container_mc.buttonMode = true;
      
      function click(e:Event):void {
          //e.target is a reference to what was clicked (see caveat after code sample)
      
          //if all the children of container_mc are of the same custom class, 
             //you could now call a click handler on that item
      
          MyButtonClass(e.target).myClickHandler(e);
      
          //or you could use a switch statement
          switch(e.target){
              case button1:
                  //button 1 was clicked, do something with it
                  break;
      
              case button2:
                  //button 2 was clicked, do something with it
                  break;
          }
      }
      

      这里唯一需要注意的是,事件的目标可以是容器下线的任何子级。因此,如果button1 有一些孩子并且这些孩子有孩子,那么e.target 中引用的对象可能是其中的任何一个(曾经被点击过)。如果您的按钮中有子对象,那么确保您的目标始终是按钮的最简单方法是执行以下操作:

      button1.mouseChildren = false;
      

      这将确保按钮调度的任何鼠标事件都将button1 作为目标,而不是它的任何子级。

      【讨论】:

        【解决方案4】:

        请忽略不赞成票...如果您的问题与我的相同, 那么这个解决方案有效

        //-- pseudo code --\\
        
        *for the container:*
        container.addEventListener( MouseEvent.MOUSE_DOWN , callback_function ) ;
        container.buttonMode ...... false
        container.mouseEnabled .... false
        container.mouseChildren ... true
        
        *for each child:*
        child.buttonMode ...... true
        child.mouseEnabled .... true
        child.mouseChildren ... false
        

        【讨论】:

        • 这毫无意义,而且是一个非常糟糕的答案。它没有任何解释,对未来的访问者也没有帮助。
        • 我的意思是,只有代码的答案通常不被接受。最重要的是,您发布了伪代码,而您的伪代码的后半部分没有多大意义(至少对我而言)并且不会解决您的问题 - 尽管这可能只是一个错字。无论如何,这是一个糟糕的答案(无论它是否对您“有效”)。好的答案解释代码,格式正确并解决问题,而不是仅仅发布一些没有解释的伪代码。
        • 至于“它只需要容器上的一个事件监听器”,显然我知道这一点,你会看到我在 5 天前回答了这个问题,向你解释了很多。
        猜你喜欢
        • 2013-08-21
        • 1970-01-01
        • 1970-01-01
        • 2011-05-26
        • 1970-01-01
        • 1970-01-01
        • 2017-09-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多