4

我遇到了一些我自己构建的自定义按钮的问题。它由一个盒子和一个下面的小线组成。Android:检测按钮外的ACTION_UP事件

当您按下按钮时,该按钮会垂直向下动画,并在您释放时再次向上。这是在CustomButton.class处理:

super.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { 
        buttonContent.startAnimation(rectMoveDown); 
        colorDown.start(); 
        return false; 
       } 
       if (event.getActionMasked() == MotionEvent.ACTION_UP) { 
        buttonContent.startAnimation(rectMoveUp); 
        colorUp.start(); 
        return false; 
       } 
       return false; 
      } 
     }); 

然后在应用程序的其余部分我用这个按钮并设置clicklistener它。因此我返回false(我认为这至少是正确的),因为我不想使用该事件,而是将其传递给层次结构中的clicklistener。

但是,当我第一次按下按钮时,出现问题,将我的手指移动到按钮之外,然后释放屏幕。然后该按钮不显示在ACTION_UP侦听器中完成的动画。

有没有人有线索如何解决这个问题?

回答

3

发现我怎么可能经过一些测试解决它!

文档中读取一些后,我发现,MotionEvent.ACTION_CANCEL不正是我需要的:

目前的姿态已经中止。你将不会再收到 点数。您应该将此视为上传事件,但不会执行您通常会执行的任何操作。

所以现在我TouchListener这个样子(与就像它应该):

super.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       switch (event.getActionMasked()) { 
        case MotionEvent.ACTION_DOWN: 
         buttonContent.startAnimation(rectMoveDown); 
         colorDown.start(); 
         return false; 
        case MotionEvent.ACTION_UP: 
        case MotionEvent.ACTION_CANCEL: 
         buttonContent.startAnimation(rectMoveUp); 
         colorUp.start(); 
         return false; 
       } 
       return false; 
      } 
     }); 

这并不是说我就开始使用该解决它的开关情况,但我改变了它在为了使代码看起来更好。正如你所看到的,我以完全相同的方式处理ACTION_UP和ACTION_CANCEL。

为了让OnClickListener能够触发它,如果我返回true,我将返回false。

1

您应该使用,而不是如果开关的情况下返回true:

public boolean onTouch(View v, MotionEvent event) { 
      switch (event.getAction()) { 
       case MotionEvent.ACTION_UP: 
        // Some code 
        return true; 
       case MotionEvent.ACTION_DOWN: 
        // Some code 
        return true; 
      } 
      return false; 
     } 

这个工作对我来说,我希望这可以帮助你

+0

这不适合我!首先,我需要返回false,否则按钮不会触发连接到它的点击监听器。即使当我回归真实时,它也不起作用。 –