【问题标题】:Swipe with tab host使用标签主机滑动
【发布时间】:2013-04-04 07:23:48
【问题描述】:

我有一个 TabHost 控件(不在操作栏中),我希望在用户在每个选项卡上滑动上下文时更改选项卡(类似于 whatsapp 表情符号选项卡)。
我怎样才能做到这一点?

编辑
手感也很重要。我希望上下文应该有滚动动画(无论用户是否滑动或单击选项卡)。

【问题讨论】:

标签: android android-tabhost swipe nui


【解决方案1】:

您可以覆盖 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;
}

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】:

    通过此链接 http://thepseudocoder.wordpress.com/2011/10/13/android-tabs-viewpager-swipe-able-tabs-ftw/

    您可以使用手势检测器。

    手势检测器

    使用提供的 MotionEvents 检测各种手势和事件。 GestureDetector.OnGestureListener 回调将在发生特定运动事件时通知用户。此类只能与通过触摸报告的 MotionEvents 一起使用(不要用于轨迹球事件)。要使用这个类:

    1 为您的视图创建 GestureDetector 的实例 在 nTouchEvent(MotionEvent) 方法中确保您调用

    2 onTouchEvent(MotionEvent)。回调中定义的方法将在事件发生时执行

    本页展示了如何使用 GestureDetector 识别滑动手势:

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

    【讨论】:

      【解决方案3】:

      我使用了手势检测器... 您的 Fragment 需要实现 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(boolean Direction)

        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);
        
           }
        
        
        }
        

      希望对你有帮助...

      【讨论】:

        【解决方案4】:

        如果您已经创建了自定义活动和视图,那么我建议这样:

        实现 OnGestureListener 在当前活动中的接口并覆盖 onfling 方法

        实施完全取决于您。

        【讨论】:

        • 但感觉不一样。如果我单击一个选项卡,它不会为滚动设置动画。我怎样才能以正确的方式做到这一点。我是安卓开发新手。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 2016-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多