【问题标题】:Android: MotionEvent ACTION_UP doesn't trigger after ACTION_CANCELAndroid:在 ACTION_CANCEL 之后不触发 MotionEvent ACTION_UP
【发布时间】:2022-06-19 20:28:18
【问题描述】:

我正在制作像 instagram 这样的视频故事。所以我遇到了手势问题。

问题是我在做这些动作时处理了 ACTION_CANCEL,如果我举起手指,ACTION_UP 不会调用

  1. 我在 ViewPager 的第一页,我向左->向右快速滑动(我的手指仍在屏幕上)
  2. 我在 ViewPager 的中间,我向左->向右或向右->向左滑动,但没有完成滑动,我仍然在当前页面中并且我的手指在屏幕上
  3. 我在屏幕上乱动(我的手指还在屏幕上)

所以如果我在调用 ACTION_CANCEL 后抬起手指,我的视频将保持“暂停”状态

最后,问题是:Action_Cancel 之后如何处理 Action_Up 事件?

override fun onTouch(v: View?, event: MotionEvent?): Boolean {
    if (gestureDetector?.onTouchEvent(event) == true) return true

    when (event?.actionMasked) {
        MotionEvent.ACTION_DOWN -> {
            viewModel.videoPause()
        }
        MotionEvent.ACTION_UP -> {
            viewModel.videoResume()
        }
        MotionEvent.ACTION_CANCEL -> {
            // Handles when doing these moves and ACTION_UP doesn't call if I raise my finger
            // 1. I'm in 1st page of ViewPager and I swipe left->right fastly (my finger still on screen)
            // 2. I'm in the middle of ViewPager and I swipe left->right or right->left, but not finishing the swipe
            // and I'm still in the current page and my finger on screen
            // 3. I'm moving chaosly on screen (my finger still on screen)


            // So if I raise my finger after ACTION_CANCEL called, my video stay in "PAUSE" state
        }
        else -> { }
    }

    return true
}

【问题讨论】:

    标签: android kotlin motionevent user-stories


    【解决方案1】:

    ACTION_CANCEL 之后你不会得到ACTION_UP

    ACTION_CANCEL

    public static final int ACTION_CANCEL

    getActionMasked() 的常量:当前手势已中止。 您将不会再获得任何积分。您应该将此视为向上事件,但不要执行通常会执行的任何操作。

    【讨论】:

    • 是的,我知道,但是在 actionCancel 之后还有其他处理 actionUp 的方法吗?因为我的手指还在屏幕上,当我抬起手指时,没有任何处理
    • @NursultanAlmakhanov 它是说当你得到ACTION_CANCEL 时,就是这样——你不会得到那个手势的其他事件,包括ACTION_UP。就像它说的那样,“您应该将其视为向上事件” - 这是ACTION_UP 的另一种种类,但您应该将手势视为已取消而不是已完成。因此,在您的情况下,如果您在用户放下手指时暂停,并且在他们抬起手指时取消暂停(ACTION_UP),那么您似乎也想在取消暂停时取消暂停?所以它只会在用户触摸视频时暂停
    • 我想在用户抬起手指时取消暂停,而不是在 actionCancel 上。但我暂时在 actionCancel 上设置了 unpause 并寻找其他解决方案。
    • @NursultanAlmakhanov 这不是它的工作原理 - 一个手势开始ACTION_DOWN 事件,并以 eitherACTION_UP 结束 ACTION_CANCEL,具体取决于手势的终止方式(例如,抬起手指与移出视图)。您的手指是否仍在触摸屏幕并不重要 - 当您收到 ACTION_CANCEL 时,手势已完成,您将不会再收到任何事件(因此您不能告诉手指何时抬起)。如果您想完全避免手势被取消,这里有一些方法:stackoverflow.com/q/6018309
    【解决方案2】:

    其实是有办法的。

    @Override
        public boolean onTouchEvent(MotionEvent event) {
            super.onTouchEvent(event);
            performClick();
            switch (event.getAction()){
                case MotionEvent.ACTION_MOVE:
                    float x = event.getX();
                    float y = event.getY();
                    Log.d("coordinates: ","x : "+String.valueOf(x)+"y : " + String.valueOf(y));
                    break;
                case MotionEvent.ACTION_UP:
                    Log.d("action","up")
            }
            return true;
        }
    

    将此添加到您的父视图。这将在手指移动时向您显示手指的位置。而且(我不知道如何)但是当您握住手指时,它也会触发动作。因此,只要触发了向上操作,您就会知道用户握住了他的手指,或者每当 x 或 y 坐标在您的父视图之外时,您都可以将其视为用户握住了他的手指。 (我从一个画布问题 [https://stackoverflow.com/questions/21846584/android-canvas-draw-by-finger] 中得到了这个想法)

    【讨论】:

      猜你喜欢
      • 2011-07-11
      • 1970-01-01
      • 2013-10-30
      • 2013-10-22
      • 2011-08-26
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多