无法在视图上检测到触摸事件并在父视图上检测到单击事件

时间:2012-04-03 10:31:15

标签: android gesture ontouchlistener onclicklistener

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

我的问题是,如果我在'home'触摸侦听器的true方法中返回onTouch,我才能完成操作。如果我返回false,则不会调用onFling。为什么?从我读过的文档来看,这只意味着事件已被消耗,即我的理解是它不会传播给其他听众。

所以:

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

  • 如果我在false中返回onTouch,则不会调用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;
    }
}

3 个答案:

答案 0 :(得分:1)

onTouch()消费该事件,您应该在方法onTouch()中,返回false而非真实

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

编辑:

更改你的方法onTouch(),如下所示:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我会尝试

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

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