【发布时间】: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