2013-04-04 61 views
2

我有一個TabHost控件(不在操作欄中),我想讓用戶在每個選項卡上滑動上下文時(例如whatsapp emoji選項卡)更改選項卡。
我該怎麼做?滑動選項卡主機

編輯
感覺也很重要。我希望上下文應該有滾動動畫(無論用戶是否滑動或單擊了該選項卡)。

+0

http://androidexample.com/Swipe_screen_left__right__top_bottom/index.php?view=article_discription&aid=95&aaid=118 – 2016-04-15 01:28:03

回答

2

通過這個鏈接 http://thepseudocoder.wordpress.com/2011/10/13/android-tabs-viewpager-swipe-able-tabs-ftw/

您可以使用手勢檢測。

GestureDetector

檢測使用所提供的MotionEvents各種手勢和事件。當發生特定的運動事件時,GestureDetector.OnGestureListener回調將通知用戶。該類只能用於通過觸摸報告的MotionEvents(不要用於軌跡球事件)。要使用這個類:

1爲View在nTouchEvent(MotionEvent)方法創建GestureDetector的實例,確保您撥打

2的onTouchEvent(MotionEvent)。

http://smartandroidians.blogspot.in/2010/04/swipe-action-and-viewflipper-in-android.html

1

如果您已經創建了一個自定義活動和看法,那麼我建議是這樣的:

實施OnGestureListener接口在當前的活動,並覆蓋onfling方法

執行完全取決於你。

+0

但它的感覺不一樣。如果我點擊一個標籤,它不會爲動畫滾動。我怎樣才能以正確的方式做到這一點。我在android開發新。 – nrofis 2013-04-04 07:41:30

6

您可以覆蓋的onTouchEvent:

@Override 
public boolean onTouchEvent(MotionEvent touchevent) { 
    switch (touchevent.getAction()) { 
    // when user first touches the screen to swap 
    case MotionEvent.ACTION_DOWN: { 
     lastX = touchevent.getX(); 
     break; 
    } 
    case MotionEvent.ACTION_UP: { 
     float currentX = touchevent.getX(); 

     // if left to right swipe on screen 
     if (lastX < currentX) { 

      switchTabs(false); 
     } 

     // if right to left swipe on screen 
     if (lastX > currentX) { 
      switchTabs(true); 
     } 

     break; 
    } 
    } 
    return false; 
} 
在回調中定義的方法將在事件發生

這個頁面展示如何使用GestureDetector承認輕掃手勢來執行

switchTabs方法:

public void switchTabs(boolean direction) { 
     if (direction) // true = move left 
     { 
      if (tabHost.getCurrentTab() == 0) 
       tabHost.setCurrentTab(tabHost.getTabWidget().getTabCount() - 1); 
      else 
       tabHost.setCurrentTab(tabHost.getCurrentTab() - 1); 
     } else 
     // move right 
     { 
      if (tabHost.getCurrentTab() != (tabHost.getTabWidget() 
        .getTabCount() - 1)) 
       tabHost.setCurrentTab(tabHost.getCurrentTab() + 1); 
      else 
       tabHost.setCurrentTab(0); 
     } 
    } 
2

我用手勢探測器... 你的片段需要實現OnGestureListener。然後在onCreateView中初始化一個TabHost。

private FragmentTabHost mTabHost; // global in fragment 

下面是一個代碼:

private GestureDetectorCompat gDetector; // global in fragment 
  • 在onCreateView

    gDetector = new GestureDetectorCompat(getActivity(), new OnGestureListener() { 
    
        @Override 
        public boolean onDown(MotionEvent e) { 
         return true; 
        } 
    
        @Override 
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
         float velocityY) { 
         Log.i("motion", "onFling has been called!"); 
         final int SWIPE_MIN_DISTANCE = 120; 
         final int SWIPE_MAX_OFF_PATH = 250; 
         final int SWIPE_THRESHOLD_VELOCITY = 200; 
         try { 
          if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
           return false; 
          if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE 
           && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
           Log.i("motion", "Right to Left"); 
           switchTabs(false); 
          } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE 
           && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
    
           Log.i("motion", "Left to Right"); 
           switchTabs(true); 
    
          } 
         } catch (Exception e) { 
          // nothing 
         } 
         return false; 
        } 
    
        @Override 
        public void onLongPress(MotionEvent e) { 
    
        } 
    
        @Override 
        public boolean onScroll(MotionEvent e1, MotionEvent e2, 
          float distanceX, float distanceY) { 
         return false; 
        } 
    
        @Override 
        public void onShowPress(MotionEvent e) { 
    
        } 
    
        @Override 
        public boolean onSingleTapUp(MotionEvent e) { 
            return false; 
        } 
    }); 
    
        mTabHost.setOnTouchListener(new View.OnTouchListener() { 
        @Override 
         public boolean onTouch(View v, MotionEvent event) { 
          return gDetector.onTouchEvent(event); 
         } 
        }); 
    
  • 方法switchTabs(布爾方向)

    public void switchTabs(boolean direction) { 
    
        Log.w("switch Tabs", "idemo direction"); 
        if (direction) // true = move left 
        { 
         if (mTabHost.getCurrentTab() != 0) 
         mTabHost.setCurrentTab(mTabHost.getCurrentTab() - 1); 
        } else 
        // move right 
        { 
         if (mTabHost.getCurrentTab() != (mTabHost.getTabWidget() 
          .getTabCount() - 1)) 
         mTabHost.setCurrentTab(mTabHost.getCurrentTab() + 1); 
    
        } 
    
    
    } 
    

希望它可以幫助...

相關問題