【问题标题】:Can't get touch event detected on a view and click event detected on a parent view无法在视图上检测到触摸事件并在父视图上检测到单击事件
【发布时间】:2012-04-19 18:57:43
【问题描述】:

我有一个填满屏幕的布局“layout_base”和一个子视图“home”。 我在 'layout_base' 上设置了一个 OnClickListener 来执行一些操作(如果弹出窗口打开,则关闭它),并在 'home' 上设置一个 OnTouchListener 来执行一些其他操作(在 fling 上翻译)。

我的问题是,只有在“home”触摸侦听器的 onTouch 方法中返回 true 才能完成操作。如果我返回false,则不会调用 onFling。为什么?从我读到的文档中,这仅意味着该事件已被消耗,即据我所知,它不会传播给其他侦听器。

所以:

  • 如果我在onTouch中返回true,则调用onFling,但是不会调用父视图'layout_base'的onClickListener中的onClick。

  • 如果我在onTouch中返回false,则不会调用onFling,但随后会调用父视图'layout_base'的onClickListener中的onClick。

如何让我的 onFling 检测在“home”上工作,我的 onClick 检测在“layout_base”上工作?

谢谢你

layout_base = findViewById(R.id.layout_base);
layout_base.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) { 
        closePopup();  // never called
    }
});     

contentGestureDetector = new GestureDetector(new ContentGestureListener());
contentGestureListener = new View.OnTouchListener() 
{
    public boolean onTouch(View v, MotionEvent event) 
    {  
        contentGestureDetector.onTouchEvent(event);
        return true; // onFling only called if return true
    }
};

home.setOnTouchListener(contentGestureListener);

class ContentGestureListener extends SimpleOnGestureListener {

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {


        final int SWIPE_MIN_DISTANCE = 120;
        final int SWIPE_MAX_OFF_PATH = 250;
        final int SWIPE_THRESHOLD_VELOCITY = 200; 

        if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
            return false;

        if(e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            if(!mMenuOpen){                        
                mOpenMenuAnim.start();
                mMenuOpen = true;
            }
        }
        else if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            if(mMenuOpen){ 
                mCloseMenuAnim.start();
                mMenuOpen = false;
            }
        }

        return false;
    }
}

【问题讨论】:

  • 您能否也粘贴整个活动/布局。

标签: android gesture ontouchlistener onclicklistener


【解决方案1】:

onTouch() 消费事件,你应该在你的方法 onTouch() 中,返回 false 而不是 true

public boolean onTouch(View v , MotionEvent motionEvent) {
  // your code 
  return false;
}

编辑:

像这样改变你的 onTouch() 方法:

public boolean onTouch(View v, MotionEvent event) 
    {  
        return contentGestureDetector.onTouchEvent(event);
    }

【讨论】:

  • 实现你的gestureDetector的onTouch()并返回false,
  • 我已经实现了onTouch(),我应该在哪里再次实现它?
  • 在您的 ContentGestureListener 类中,并返回 false
  • onTouch 不是SimpleOnGestureListener 的方法:developer.android.com/reference/android/view/…,你能给我一些代码吗?
  • return contentGestureDetector.onTouchEvent(event);onFling() 不被调用:(
【解决方案2】:

我也遇到过同样的事情。您需要在 onTouch down 事件中返回 true 以接收 move 和 up 事件(并使手势起作用)。然后您需要实现talked about here 的功能之一,以使其余的工作。希望这会有所帮助。

【讨论】:

    【解决方案3】:

    我会努力的

    • 在 onTouch 中返回 false => onClick 被调用
    • 在 Home.onInterceptTouchEvent 中,如果检测到“fling”(通过比较传入 MOVE 操作的 x/y 值),则可以返回 true

    通过返回 true,将取消对 layout_base 的事件,并且在这种情况下不会发生 onClick。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-10
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      相关资源
      最近更新 更多