Long press in GestureDetector also fires on tap

一个人想着一个人 提交于 2019-11-30 18:08:45
arudoy

You need to override onDown and make it return true. The following code worked for me:

class SimpleGestureListener extends GestureDetector.SimpleOnGestureListener {

    @Override
    public boolean onDown(MotionEvent event) {
      // triggers first for both single tap and long press
      return true;
    }

    @Override
    public boolean onSingleTapUp(MotionEvent event) {
      // triggers after onDown only for single tap
      return true;
    }

    @Override
    public void onLongPress(MotionEvent event) {
      // triggers after onDown only for long press
      super.onLongPress(event);
    }
}
tomorrow

As I mention in my comment, you should distinguish between onSingleTapUp() and onSingleTapUP(). Using the Override annotation is a good practice.

I'm a bit confused because the title of your question seems to indicate that a long press also fires the on tap event, while the text of your question says it the other way around. That is that a tap fires a long press event. If the later is the case, try returning true from your onSingleTapUp(). This works for me using the SimpleGestureListener:

class SimpleGestureListener extends GestureDetector.SimpleOnGestureListener {

  @Override
  public boolean onDown(MotionEvent event) {
     //...
    return super.onDown(event);
  }

  @Override
  public boolean onSingleTapUp(MotionEvent event) {
    //...
    return true;
  }

  @Override
  public void onLongPress(MotionEvent event) {
    //...
    super.onLongPress(event);
  }
}

I hope it helps.

Solution above works (returning true in onDown()). I have also made it work by setting clickable and focusable property of View to true before setting GestureDetector.

val gestureDetectorCompat = GestureDetectorCompat(context, object : GestureDetector.SimpleOnGestureListener() {
        override fun onSingleTapConfirmed(e: MotionEvent?): Boolean {
            // log "Single Tap Confirm"
            return true
        }

        override fun onLongPress(e: MotionEvent?) {
            // log "Long Press"
        }
    })
image_stateful.isClickable = true
image_stateful.isFocusable = true
image_stateful.setOnTouchListener { _, event -> gestureDetectorCompat.onTouchEvent(event) }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!