【问题标题】:How to reset OnTouchListener?如何重置 OnTouchListener?
【发布时间】:2016-12-07 06:35:46
【问题描述】:

我有一个自定义对象,它也扩展了View.OnTouchListener。它使用onTouch 事件进行拖动。每当此自定义对象检测到与目标对象的碰撞时,它都会触发自定义事件。收到此事件后,MainActivity 使用该自定义对象的公共方法启动动画,将自定义对象移动到初始位置。在AnimatorSet 的onAnimationStart 中,OnTouchListener 设置为null,而在onAnimationEnd 中,该自定义对象再次分配了OnTouchListener - 这是故障的罪魁祸首,如下所示。 我触摸自定义视图并将手指拖动到目标对象,但是当返回初始位置的动画开始时我没有松开手指并继续围绕目标对象拖动它。自定义视图返回到初始位置,然后在触摸位置重新出现并返回到初始位置,如此反复。

我尝试破坏 MOVE 事件,返回“true”以使用该事件,但没有任何帮助。如何从之前的触摸中释放/重置新的onTouchListener?

onTouch 代码(在 MyCustomObject 类中):

@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;

    }

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

    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);

                }

            }

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

public void returnToInitPosition(final View view) {

    //return to initial position animation
    AnimatorSet set = new AnimatorSet();
    set.playTogether(---my anims---);

    //temporary remove of onTouch listener
    set.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationStart(Animator animation) {
            super.onAnimationStart(animation);

            //remove listener on animation start
            view.setOnTouchListener(null);
        }

        @Override
        public void onAnimationEnd(Animator animation) {
            super.onAnimationEnd(animation);

            //re-add listener on animation complete
            view.setOnTouchListener(MyCustomObject.this);
        }

    });

    //start animation
    set.start();

}

【问题讨论】:

  • 我还尝试从动画结束跳跃调度 ACTION_UP 事件,它会破坏拖动。
  • 也尝试在动画状态下使用view.setEnabled(false);和view.setEnabled(true);,但一切都一样,继续之前的手势。
  • 不太清楚,你在问什么。
  • 我在问如何确保我的 CustomObject 在发生碰撞事件后会保持在原位,我需要重新触摸它才能再次拖动它。换句话说,即使用户继续拖动手指,我也需要模拟在触发事件时释放手指。
  • 我什至尝试在 1 秒后使用 Runnable 和 Handler 重新分配 OnTouchListener,但如果我继续拖动手指超过 1 秒,我的自定义对象仍然会对之前的手势做出反应。

标签: android android-view


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 2023-01-18
    相关资源
    最近更新 更多