【android】TabActivity實現手指左右滑動切換tab

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章