在做項目的時候主介面有好幾個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 {@Overridepublic 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
@Overridepublic 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。