我有一个按钮,我是动画按钮按下。我希望在拖到某个阈值之外之后,它能恢复到“正常”状态。
我在ACTION_DOWN上创建了一个视图边界矩形,并检查它是否超出ACTION_MOVE中的接触区域。我成功地检测到了“越界”触摸,但我无法让视线停止聆听触摸。就像它忽略了我的animateToNormal()方法一样。
我尝试将布尔值返回值改为true而不是false,但这没有帮助。我也试过在ACTION_MOVE情况下删除touch listener(设置为空),但我需要重新连接才能继续收听touch。我想我可以在添加之前添加一个任意的延迟,但这似乎是一个可怕的黑客。
我正在4.2设备(lg g2)上测试。

private static class AnimationOnTouchListener implements View.OnTouchListener {
        private Rect rect;

        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {

            switch(motionEvent.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    rect = new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
                    animatePressed();
                    return false;

                case MotionEvent.ACTION_CANCEL:
                case MotionEvent.ACTION_UP:
                    // back to normal state
                    animateBackToNormal();
                    return false;

                case MotionEvent.ACTION_MOVE:
                    if(!rect.contains(view.getLeft() + (int) motionEvent.getX(), view.getTop() + (int) motionEvent.getY())){
                        d(TAG, "out of bounds");
                        animateBackToNormal();
                        // STOP LISTENING TO MY TOUCH EVENTS!

                    } else {
                        d(TAG, "in bounds");
                    }
                    return false;
                default:
                    return true;
            }
        }

最佳答案

为什么你不一直听,却设置一个语句来忽略运动事件?
像这样的:

private static class AnimationOnTouchListener implements View.OnTouchListener {
        private Rect rect;
        private boolean ignore = false;

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        if(ignore && motionEvent.getAction()!=MotionEvent.ACTION_UP)
           return false;
        switch(motionEvent.getAction()) {
            case MotionEvent.ACTION_DOWN:
                rect = new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
                animatePressed();
                return false;

            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_UP:
                // back to normal state
                animateBackToNormal();

                // IMPORTANT - touch down won't work if this isn't there.
                ignore = false;
                return false;

            case MotionEvent.ACTION_MOVE:
                if(!rect.contains(view.getLeft() + (int) motionEvent.getX(), view.getTop() + (int) motionEvent.getY())){
                    d(TAG, "out of bounds");
                    animateBackToNormal();
                    // STOP LISTENING TO MY TOUCH EVENTS!
                    ignore = true;
                } else {
                    d(TAG, "in bounds");
                }
                return false;
            default:
                return true;
        }
    }

07-27 13:24