2013-04-04 60 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); 
    
        } 
    
    
    } 
    

希望它可以帮助...

相关问题