Android:在按钮

时间:2015-07-28 11:19:57

标签: java android android-animation onclicklistener ontouchlistener

我在构建自定义按钮时出现问题。它由一个盒子和下面的一条小线组成。

当您按下按钮时,按钮会垂直向下动画,当您释放按钮时按钮会再次向上动画。这在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侦听器中完成的动画。

有没有人知道如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

经过多次测试后,我发现了如何解决这个问题!

在阅读文档中的其他内容后,我发现MotionEvent.ACTION_CANCEL完全符合我的需要:

  

当前手势已中止。你不会再收到了   其中的一点。你应该把它当作一个up事件,但不要执行   你通常会采取的任何行动。

所以现在我的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;
            }
        });

并不是我开始使用解决它的switch-case,但我更改了它以使代码看起来更好。如您所见,我以完全相同的方式处理ACTION_UP和ACTION_CANCEL。

我在任何地方都返回false,以便触发OnClickListener,如果我返回true则不会触发它。

答案 1 :(得分:1)

你应该使用switch代替if,并在以下情况下返回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;
        }

这对我有用,我希望这可以帮助你