在ViewPager中滑动方向

Gre*_*eso 15 android direction swipe android-viewpager fragmentstatepageradapter

我有一个使用ViewPager和FragmentStatePagerAdapter的Android应用程序.然而,我需要添加一个新功能,我必须知道滑动方向从一个片段视图移动到另一个,左或右.(也就是说,当我向左滑动时,我会做一件事,当我向右滑动时,我会做其他事情).

请注意,我不需要在滑动结束后发生事件.滑动发生时我必须做这些事件.我想过使用setOnPageChangeListener()但它并没有告诉我滑动方向.你能告诉我如何找出滑动方向吗?

谢谢.

Tom*_*ila 7

这很简单,引入了一个实例变量来跟踪当前页面。

public class MyActivity extends Activity implements ViewPager.OnPageChangeListener {

    private ViewPager viewPager;
    private int currentPosition;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Do trivial stuff
        .
        .
        .
        viewPager.setOnClickListener(this); // doesnt have to be in onCreate
    }

    @Override
    public void onPageSelected(int position) {
        if(currentPosition < position) {
            // handle swipe LEFT
        } else if(currentPosition > position){
            // handle swipe RIGHT
        }
        currentPosition = position; // Update current position
    }
}
Run Code Online (Sandbox Code Playgroud)


dre*_*ees 7

我就遇到了这个问题,并需要知道刷卡的方向,因为它正在发生,以防止在某个方向滑动.这是我如何解决我的问题,希望它对某人有帮助.我发现前面的所有例子都不符合我的要求.

如果您继承了ViewPager,则可以响应onInterceptTouchEvent(MotionEvent event)和的onTouchEvent(MotionEvent event)方法ViewPager

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    boolean wasSwipeToRight = this.wasSwipeToRightEvent(event));
    // Do what you want here with left/right swipe

    return super.onInterceptTouchEvent(event);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    boolean wasSwipeToRight = this.wasSwipeToRightEvent(event));
    // Do what you want here with left/right swipe

    return super.onTouchEvent(event);
}
Run Code Online (Sandbox Code Playgroud)

这是调用事件方向的方法.

// Stores the starting X position of the ACTION_DOWN event
float downX;

/**
 * Checks the X position value of the event and compares it to
 * previous MotionEvents. Returns a true/false value based on if the 
 * event was an swipe to the right or a swipe to the left.
 *
 * @param event -   Motion Event triggered by the ViewPager
 * @return      -   True if the swipe was from left to right. False otherwise
 */
private boolean wasSwipeToRightEvent(MotionEvent event){
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            downX = event.getX();
            return false;

        case MotionEvent.ACTION_MOVE:
        case MotionEvent.ACTION_UP:
            return downX - event.getX() > 0;

        default:
            return false;
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

看一下ViewPager.OnPageChangeListeneronPageSelected(int position)方法.在给新选择的页面的索引.如果您跟踪当前页面索引,则可以将其与索引进行比较以获得滑动的左/右方向.positionposition

既然你提到OnPageChangeListener没有帮助,请考虑onInterceptTouchEvent (MotionEvent ev)方法ViewPager.考虑MotionEvent的ACTION_DOWN,ACTION_MOVE和ACTION_UP.希望这可以帮助.