我有一个布局“layout_base”,它填充了屏幕和子视图“home”。 我在'layout_base'上设置了一个OnClickListener
来执行一些操作(如果它打开,关闭一个弹出窗口),并在'home'上执行一个OnTouchListener
以执行其他操作(翻转翻译)。无法在视图上检测到触摸事件并在父视图上检测到单击事件
我的问题是,如果我在'home'touch侦听器的onTouch
方法中返回true
,我只能完成操作。如果我返回false
,则不会调用onFling。为什么?从我读过的文档中,这只意味着该事件被消耗,即从我的理解中,它不会传播给其他听众。
所以:
,如果我在
onTouch
返回true
,onFling
被调用,但随后的onClick父视图的onClickListener 'layout_base' 不叫。,如果我在
onTouch
返回false
,onFling
不叫,但随后的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;
}
}
你也可以粘贴你的整个活动/布局。 – Deva 2012-04-03 10:55:27