0

我正在构建一个按钮面板,这些按钮包含在 Canvas 容器中。为此,我创建了一个MyButton类,它是 UIComponent 的子类。MyButton 类还有 2 个其他子类:MyRadioButtonMyMenuButton,它们在MouseEvent.MOUSE_DOWN. MyMenuButton创建并显示一个菜单,我从 XML 构建它并且构建正常。

我在超类中添加侦听器,如下所示:

this.addEventListener(MouseEvent.CLICK, handleClick);
this.addEventListener(MouseEvent.MOUSE_DOWN, handleMouse);
this.addEventListener(MouseEvent.MOUSE_UP, handleMouse);

它是在创建阶段完成的。

在我的子类中,我覆盖了handleMouse处理程序。

override protected handleMouse(event:MouseEvent) : void
{
  // subclass specific handling
}

这些按钮对象被添加到画布容器中,如下所示:

在课堂上MyButtonsContainer.as

this.rowChildren.addChild(button);

这些按钮完美地绘制到位。问题是行为:事件没有到达超类的 handleClick 处理程序。这就是问题所在——为什么会这样?提前致谢

编辑:似乎 MOUSE_DOWN 和 MOUSE_UP 会干扰 CLICK 事件。当我删除他们的侦听器时,我可以单击处理程序。如何使他们生活在一起?

4

4 回答 4

2

我设法将事件捕获为&CLICK之间的时间差。MOUSE_DOWNMOUSE_UP

编辑:短/长解释:出于某种原因,我的MOUSE_DOWN/MOUSE_UP事件听众干扰了MouseEvent.CLICK. 有人建议我放弃收听MouseEvent.CLICK,而是启动计时器MouseEvent.MOUSE_DOWN并再次检查计时器MouseEvent.MOUSE_UP。如果差异小于 0.1(您可以设置另一个阈值),那么它实际上是一次点击。

现在一些示例代码:

public class MyButton extends UIComponent
{
   ...
   private var _clickTime : Number = 0.;

   public function void MyButton()
   {
       super();
       addEventListener(MouseEvent.MOUSE_DOWN, handleMouse);
       addEventListener(MouseEvent.MOUSE_UP, handleMouse);
   }

   protected function checkForClick(event:MouseEvent) : Boolean
   {
      var down : Boolean = event.type == MouseEvent.MOUSE_DOWN;

      if (down)
         _clickTime = getTimer();
      else {
          var diff : Number  = getTimer() - _clickTime;
          if (diff/1000. < 1.) {
              handleClick();
              return true;
          }
      }
      return false;
   }

   protected function handleClick(event:MouseEvent) : void
   {
       // handle the click here
   }

   protected function handleMouse(event:MouseEvent) : void
   {
       checkForClick(event);
       ... 
       // take care of your button graphic state
   }

免责声明:此代码对我有用,对我和我的应用程序需求都有好处。如果您不同意这种方式或有更好的建议方式,请在评论中提出。由于此答案回答了我自己的问题,并且仅因为要求我这样做而添加了此 EDIT,因此如果您不同意,请不要投反对票。

于 2011-05-23T07:14:04.063 回答
0

像这样调用超类方法

override protected handleMouse(event:MouseEvent) : void
{
  super.handleMouse(event);
  // subclass specific handling
}
于 2011-05-17T05:06:52.933 回答
0

如果我对您的理解正确,您只需要确保在您覆盖的处理程序中,您以调用 super 结束每个处理程序 -

override protected handleMouse(event:MouseEvent):void {
// my logic here for the subclass
trace("blah blah blah");

//now redispatch up to the superclass.
super.handleMouse(event);

}
于 2011-05-17T05:07:50.887 回答
0

我不是 100% 确定你在问什么,但我会覆盖这样的点击操作..

基类:

public class MyButton extends UIComponent
{
    /**
     * Constructor
     */
    public function MyButton()
    {
        // listeners
        addEventListener(MouseEvent.CLICK, _click);
        // ...other listeners
    }

    /**
     * Called on dispatch of MouseEvent.CLICK
     */
    private function _click(e:MouseEvent):void
    {
        doClick();
    }

    /**
     * Override this method and fill with actions to
     * do when this is clicked
     */
    protected function doClick():void
    {
        trace("base class was clicked");
    }
}

和扩展类:

public class MyOtherButton extends MyButton
{
    /**
     * Override doClick
     */
    override protected function doClick():void
    {
        super.doClick();
        trace("extending class was clicked");
    }
}

仔细检查您的代码后:

您已经为一个函数添加了两个不同的侦听器,它们不应该具有单独的函数,因为它们是由对比事件调用的吗?

this.addEventListener(MouseEvent.MOUSE_DOWN, handleMouse);
this.addEventListener(MouseEvent.MOUSE_UP, handleMouse);

此外,根据下面的代码判断,您似乎希望 handleMouse 被点击事件触发,但事实并非如此。

override protected handleMouse(event:MouseEvent) : void
{
  // subclass specific handling
}

要么,要么你忘记覆盖handleClick- 这是你在点击事件上运行的方法。您可能需要添加以下代码:

override protected handleClick(event:MouseEvent) : void
{
  // subclass specific handling for a click
}
于 2011-05-17T05:22:25.200 回答