我有一个布局'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;
}
}
答案 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)
我会尝试
返回true,将取消layout_base的事件,在这种情况下不会发生onClick。