2012-04-03 85 views
1

我有一个布局“layout_base”,它填充了屏幕和子视图“home”。 我在'layout_base'上设置了一个OnClickListener来执行一些操作(如果它打开,关闭一个弹出窗口),并在'home'上执行一个OnTouchListener以执行其他操作(翻转翻译)。无法在视图上检测到触摸事件并在父视图上检测到单击事件

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

所以:

  • ,如果我在onTouch返回trueonFling被调用,但随后的onClick父视图的onClickListener 'layout_base' 不叫。

  • ,如果我在onTouch返回falseonFling不叫,但随后的onClick父视图的onClickListener“layout_base”之称。

我该如何获得在'home'上工作的onfling检测和在'layout_base'上工作的onClick检测?

感谢您

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; 
    } 
} 
+0

你也可以粘贴你的整个活动/布局。 – Deva 2012-04-03 10:55:27

回答

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); 
    } 
+0

如果我返回false,onFling不会被调用... – jul 2012-04-03 11:02:02

+0

实现您的gestureDetector的onTouch()并返回false, – Houcine 2012-04-03 11:11:35

+0

我已经实现'onTouch()',我应该在哪里再次实现它? – jul 2012-04-03 11:29:11

0

我跑了同一件事。您需要在onTouch向下事件中返回true以接收移动和向上事件(并使手势起作用)。然后,您需要实现talked about here的功能之一,以使剩下的工作。希望这可以帮助。

0

我会尝试

  • 在onTouch =回报虚假>的onClick被称为Home.onInterceptTouchEvent
  • ,如果发现 '甩' 你可以返回true(通过比较x/y值的传入MOVE动作)

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