在做項目的時候主界面有好幾個tab, 有些用戶習慣性的左右滑屏來切換tab,所以添加了左右滑屏切換他變得功能。
基本思想:
dispatchTouchEvent在接收到用戶觸屏時間之後被觸發,所在在dispatchTouchEvent中獲取當前用戶事件,判斷是滑動,則執行切換tab,並且終止當前觸屏事件。否則則正常流程。
實現方式:
private GestureDetector gestureDetector; // 用戶滑動
gestureDetector = new GestureDetector(new TabHostTouch());
private int flaggingWidth;// 互動翻頁所需滾動的長度是當前屏幕寬度的1/3
// 獲取分辨率
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
flaggingWidth = dm.widthPixels / 3;
private class TabHostTouch extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
if (Math.abs(e1.getX() - e2.getX()) > Math.abs(e1.getY()
- e2.getY())
&& (e1.getX() - e2.getX() <= (-flaggingWidth) || e1.getX()
- e2.getX() >= flaggingWidth)) {
if (e1.getX() - e2.getX() <= (-flaggingWidth)) {
currentTabID = mTabHost.getCurrentTab() - 1;
if (currentTabID < 0) {
currentTabID = mTabHost.getTabCount() - 1;
}
mTabHost.setCurrentTab(currentTabID);
return true;
} else if (e1.getX() - e2.getX() >= flaggingWidth) {
currentTabID = mTabHost.getCurrentTab() + 1;
if (currentTabID >= mTabHost.getTabCount()) {
currentTabID = 0;
}
mTabHost.setCurrentTab(currentTabID);
return true;
}
}
return false;
}
}
override dispatchTouchEvent
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) {
event.setAction(MotionEvent.ACTION_CANCEL);
}
return super.dispatchTouchEvent(event);
}
在寫好了tab,之後修訂的功能,所以只是爲了實現這個功能而實現。
應該是可以直接用ViewPager實現這個效果的。
~~~~~~~~
android系統中的每個ViewGroup的子類都具有下面三個和TouchEvent處理密切相關的方法:
1)public boolean dispatchTouchEvent(MotionEvent ev) 這個方法用來分發TouchEvent
2)public boolean onInterceptTouchEvent(MotionEvent ev) 這個方法用來攔截TouchEvent
3)public boolean onTouchEvent(MotionEvent ev) 這個方法用來處理TouchEvent
注意:不是所有的View的子類,很多教程都說的是所有的View的子類,只有可以向裏面添加View的控件才需要分發,比如TextView它本身就是最小的view了,所以不用再向它的子視圖分發了,它也沒有子視圖了,所以它沒有dispatch和Intercept,只有touchEvent。