ActionBarActivity 中的触摸事件
Touch Events Inside ActionBarActivity
我在包含 support4 FragmentTabHost 的 support7 ActionBarActivity 中有三个选项卡。它基本上可以正常工作,点击选项卡标题会切换到正确的 Fragment。
我正在尝试添加一个 GestureDetector,以便滑动 left/right 可以更改标签页。 (我知道有更现代的容器,但现在让我们坚持使用 FragmentTabHost。)
class MainGestureDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
try {
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
return false;
final int current = tabHost.getCurrentTab();
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
if (current < tabHost.getTabWidget().getTabCount() - 1) {
tabHost.setCurrentTab(current + 1);
}
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
if (current > 0) {
tabHost.setCurrentTab(current - 1);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return super.onFling(e1, e2, velocityX, velocityY);
}
@Override
public boolean onDown(MotionEvent e) {
return true;
}
}
并这样实例化:
gestureDetector = new GestureDetector(this, new MainGestureDetector());
gestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
};
tabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
tabHost.setup(this, getSupportFragmentManager(), android.R.id.tabcontent);
tabHost.setOnClickListener(this);
tabHost.setOnTouchListener(gestureListener);
有效!但仅在第一个选项卡上。一旦滑动(或点击)切换到第一个选项卡以外的选项卡,滑动将不起作用。如果我再次点击第一个选项卡返回开头,手势识别器将再次工作...一次。
我需要做什么才能让 GestureListener 在所有选项卡上工作?
我想我应该意识到了。 "touch" 事件被定向到选项卡中的子视图,而不是传播到父视图和我在那里定义的 GestureListener。我的第一个选项卡(还)没有跨屏幕的子视图,这就是它在那里工作的原因。
我在包含 support4 FragmentTabHost 的 support7 ActionBarActivity 中有三个选项卡。它基本上可以正常工作,点击选项卡标题会切换到正确的 Fragment。
我正在尝试添加一个 GestureDetector,以便滑动 left/right 可以更改标签页。 (我知道有更现代的容器,但现在让我们坚持使用 FragmentTabHost。)
class MainGestureDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
try {
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
return false;
final int current = tabHost.getCurrentTab();
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
if (current < tabHost.getTabWidget().getTabCount() - 1) {
tabHost.setCurrentTab(current + 1);
}
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
if (current > 0) {
tabHost.setCurrentTab(current - 1);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return super.onFling(e1, e2, velocityX, velocityY);
}
@Override
public boolean onDown(MotionEvent e) {
return true;
}
}
并这样实例化:
gestureDetector = new GestureDetector(this, new MainGestureDetector());
gestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
};
tabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
tabHost.setup(this, getSupportFragmentManager(), android.R.id.tabcontent);
tabHost.setOnClickListener(this);
tabHost.setOnTouchListener(gestureListener);
有效!但仅在第一个选项卡上。一旦滑动(或点击)切换到第一个选项卡以外的选项卡,滑动将不起作用。如果我再次点击第一个选项卡返回开头,手势识别器将再次工作...一次。
我需要做什么才能让 GestureListener 在所有选项卡上工作?
我想我应该意识到了。 "touch" 事件被定向到选项卡中的子视图,而不是传播到父视图和我在那里定义的 GestureListener。我的第一个选项卡(还)没有跨屏幕的子视图,这就是它在那里工作的原因。