如何重置OnTouchListener?

时间:2016-12-07 06:35:46

标签: android android-view

我有一个自定义对象,它也扩展了View.OnTouchListener。它使用onTouch个事件进行拖动。只要此自定义对象检测到与目标对象发生冲突,它就会触发自定义事件。收到此事件后,MainActivity使用该自定义对象的公共方法来启动动画,从而将自定义对象移动到初始位置。在onAnimationStart的{​​{1}}中,AnimatorSet设置为OnTouchListener,而null中的自定义对象再次分配了onAnimationEnd - 这是故障的罪魁祸首,如下。 我触摸自定义视图并将我的手指拖动到目标对象,但是当返回初始位置的动画开始并且继续将其拖动到目标对象周围时,我不会释放我的手指。自定义视图返回到初始位置,但随后重新出现在触摸位置并返回到初始位置,这会一次又一次地重复。

我尝试打破MOVE事件,返回" true"消费这个事件,但没有任何帮助。如何从之前的触摸中释放/重置新的OnTouchListener

onTouch代码(在MyCustomObject类中):

onTouchListener

事件处理代码(在MainActivity类中):

@Override
public boolean onTouch(final View view, MotionEvent motionEvent) {
        switch (motionEvent.getAction()) {

            case MotionEvent.ACTION_DOWN: {

                //moves view's center to the click location

                break;
            }

            case MotionEvent.ACTION_UP: {

                //returns view to initial position

                break;
            }

            case MotionEvent.ACTION_MOVE: {

                //moves the view at the center of touch -- dragging function

                //checks for collision 
                if (collission occured) {

                        //trigger event
                        listener.myEvent((MyCustomObject) view);

                }

                break;
            }

        }

        //does not consume touch
        return true;

    }

returnToInitPosition()的代码(在MyCustomObject类中):

    MyCustomObject.EventsListener listener = new MyCustomObject.EventsListener() {
            @Override
            public void MyEvent(MyCustomObject submittedObject) {

                 //some code to decide if return to initial position should occur

                 //return custom object to initial position
                 submittedObject.returnToInitPosition(submittedObject);

                }

            }

1 个答案:

答案 0 :(得分:0)

我设法通过在动画启动时指定另一个触摸侦听器来解决这个问题。另一个自定义触摸侦听器忽略除ACTION_UP之外的所有其他事件(这样当前手势结束)。检测到此操作后,将重新分配原始触摸侦听器。