2012-12-02 69 views

回答

30

设置setOnPageChangeListenerViewPager

@Override 
public void onPageSelected(int arg0) { 
    if(lastPage>arg0) 
     {//User Move to left} 
    else(lastPage<arg0) 
    {//User Move to right} 
     lastPage=arg0 
} 
+8

但它给结果一旦得到屏幕滚动完全...有没有什么办法来作为开始滚动? – CoDe

+0

检查我的答案,它可能不是完美的解决方案,但它是一个开始;) – GuilhE

+1

'setOnPageChangeListener'现在已被弃用,使用'ViewPager.addOnPageChangeListener'来代替。 –

3

你可以把类的成员变量到最后保存访问

private int mLastVisitedPageIndex = 0; 

然后用下面的函数来检查方向

@Override 
public void onPageSelected(int i) { 
    boolean isMovingForward = mLastVisitedPageIndex < i?true:false; 
    //Use isMovingForward variable anywhere now 
    mLastVisitedPageIndex = i; 
} 
31

这不是一个完美的解决方案,但这里的检查刷卡方向,当你开始刷卡的方式:

new ViewPager.OnPageChangeListener() { 

      private static final float thresholdOffset = 0.5f; 
      private boolean scrollStarted, checkDirection; 

      @Override 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
       if (checkDirection) { 
        if (thresholdOffset > positionOffset) { 
         Log.i(C.TAG, "going left"); 
        } else { 
         Log.i(C.TAG, "going right"); 
        } 
        checkDirection = false; 
       } 
      } 

      @Override 
      public void onPageSelected(int position) {} 

      @Override 
      public void onPageScrollStateChanged(int state) { 
       if (!scrollStarted && state == ViewPager.SCROLL_STATE_DRAGGING) { 
        scrollStarted = true; 
        checkDirection = true; 
       } else { 
        scrollStarted = false; 
       } 
      } 
     }); 


编辑:有一个更优雅的办法,包括使用ViewPager.PageTransformer并检查它的位置间隔:

... 
myViewPager.setPageTransformer(true, new PageTransformer()); 
... 

public class PageTransformer implements ViewPager.PageTransformer { 
    public void transformPage(View view, float position) { 

     if (position < -1) { 
      // [-00,-1): the page is way off-screen to the left. 
     } else if (position <= 1) { 
      // [-1,1]: the page is "centered" 
     } else { 
      // (1,+00]: the page is way off-screen to the right.   
     } 
    } 
} 

您可以了解更多从:Using ViewPager for Screen Slides

+0

我该如何控制最左侧的点击和最右侧的点击? –

+0

你能解释一下吗? – GuilhE

+0

非常好的回应,它完美地为我工作。 在我的情况下,我需要在ViewPager的最后一页的滑动手势中开始一个活动。如果(位置== fragmentPagerAdapter.getCount ==()-1){ startActivity(intent); Finish(); } – GFPF

3

使用该

@Override 
public void onPageSelected(int position) 
{ 
    mCurrentFragmentPosition = position; 
} 
@Override 
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) 
{ 
    boolean isGoingToRightPage = position == mCurrentFragmentPosition; 
    if(isGoingToRightPage) 
    { 
     // user is going to the right page 
    } 
    else 
    { 
     // user is going to the left page 
    } 
} 
+0

这是一个很好的解决方案,因为它允许随时监控滑动方向。另一个解决方案http://stackoverflow.com/a/34356483/231590在单张幻灯片中监视滚动方向。 – soshial

0
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

     private int mCurrentSelectedScreen; 
     private int mNextSelectedScreen; 
     private static final float thresholdOffset = 0.5f; 
     private boolean scrollStarted=true, checkDirection=false; 
     ArrayList<Integer> comp_ary=new ArrayList<Integer>(); 

     @Override 
     public void onPageSelected(int arg0) { 
     } 

     @Override 
     public void onPageScrolled(int position, float positionOffset, 
       int positionOffsetPixels) { 

     //Log.e("positionOffsetPixels : "+positionOffsetPixels, "positionOffset : "+positionOffset); 
     comp_ary.add(positionOffsetPixels); 
      if (checkDirection) { 
        if (comp_ary.get(2) < comp_ary.get(comp_ary.size()-1)) { 

         Log.e("going left", "going left"); 
        } else 
         if (comp_ary.get(2) > comp_ary.get(comp_ary.size()-1)) 
        { 

         Log.e("going right", "going right"); 
        } 
        checkDirection = false; 
        comp_ary=new ArrayList<Integer>(); 
       } 
     } 

     @Override 
     public void onPageScrollStateChanged(int arg0) { 




      if (!scrollStarted && arg0 == ViewPager.SCROLL_STATE_SETTLING) { 
       scrollStarted = true; 
       checkDirection = true; 
      } else { 
       scrollStarted = false; 
      } 


     } 
    }); 
-2
pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

      if(position == pager.getCurrentItem()){ 
       // Move Right 
      } 
      else{ 
       // Move Left 
      } 

     } 
1

我解决了问题,这个实现。希望能帮助到你。

public static final float EPSILON= 0.001f; 

@Override 
public void onPageScrolled(final int position, final float positionOffset, final int positionOffsetPixels) { 

    // initial position (positionOffset == 0) 
    if (positionOffset < EPSILON) { 
     mIsRight = positionOffset < 0.5; 
     return; 
    } 

    // code here 
    if (mIsRight) { 
    } else { 
    } 
} 
9
  1. 这是我在onPageScrolled的简单的解决方案()ViewPager.OnPageChangeListener方法:

enter image description here

+0

谢谢,我认为这个解决方案非常聪明,工作很棒。 –

+0

伟大的解决方案! –

+0

简单。加工。谢谢。 –

6

相同的溶液GuilhE与未成年修复以避免在第一页上进行寻呼离开(向右滑动)时出现误报(不再使用p年龄向左)在ViewPager中。 它只是做一个额外的检查,看看是否滑动实际上已经移动。

new ViewPager.OnPageChangeListener() { 

    private static final float thresholdOffset = 0.5f; 
    private static final int thresholdOffsetPixels = 1; 
    private boolean scrollStarted, checkDirection; 

    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
    if (checkDirection) { 
     if (thresholdOffset > positionOffset && positionOffsetPixels > thresholdOffsetPixels) { 
     Log.i(C.TAG, "going left"); 
     } else { 
     Log.i(C.TAG, "going right"); 
     } 
    checkDirection = false; 
    } 
} 

    @Override 
    public void onPageSelected(int position) {} 

    @Override 
    public void onPageScrollStateChanged(int state) { 
    if (!scrollStarted && state == ViewPager.SCROLL_STATE_DRAGGING) { 
     scrollStarted = true; 
     checkDirection = true; 
    } else { 
     scrollStarted = false; 
    } 
    } 
}); 
1

我们也可以做到这一点使用自定义Viewpager,它可以包含swipeLeft()和swipeRight()方法和它的onTouchEvent(MotionEvent事件)方法可以包含ACTION_MOVE和ACTION_CANCEL情况。

//如果有帮助,这可以是代码。

public class SwiperViewPager extends ViewPager { 

    SwiperListener mSwiperListener; 
    private float downX; 
    private float downY; 
    private boolean isTouchCaptured; 
    private float upX1; 
    private float upY1; 
    private float upX2; 
    private float upY2; 

    public SwiperViewPager(Context context) { 
     super(context); 
    } 

    public SwiperViewPager(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    private float x1, x2; 
    static final int min_distance = 20; 

    boolean eventSent = false; 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     switch (event.getAction()) { 
      case MotionEvent.ACTION_MOVE: { 
       downX = event.getX(); 
       downY = event.getY(); 

       if (!isTouchCaptured) { 
        upX1 = event.getX(); 
        upY1 = event.getY(); 
        isTouchCaptured = true; 
       } else { 
        upX2 = event.getX(); 
        upY2 = event.getY(); 
        float deltaX = upX1 - upX2; 
        float deltaY = upY1 - upY2; 
        //HORIZONTAL SCROLL 
        if (Math.abs(deltaX) > Math.abs(deltaY)) { 
         if (Math.abs(deltaX) > min_distance) { 
          // left or right 
          if (deltaX < 0) { 
           if(!eventSent && mSwiperListener!=null){ 
            mSwiperListener.onLeftSwipe(); 
            eventSent = true; 
           } 
          } 
          if (deltaX > 0) { 
           if(!eventSent && mSwiperListener!=null){ 
            if(mSwiperListener.onRightSwipe()){ 
             eventSent = true; 
             return false; 
            } 
           } 
          } 
         } else { 
          //not long enough swipe... 
         } 
        } 
        //VERTICAL SCROLL 
        else { 
         if (Math.abs(deltaY) > min_distance) { 
          // top or down 
          if (deltaY < 0) { 

          } 
          if (deltaY > 0) { 

          } 
         } else { 
          //not long enough swipe... 
         } 
        } 
       } 
      } 
      break; 
      case MotionEvent.ACTION_UP: 
      case MotionEvent.ACTION_CANCEL:{ 
       isTouchCaptured = false; 
       eventSent = false; 
      } 

     } 
     return super.onTouchEvent(event); 
    } 

    public void setmSwiperListener(SwiperListener mSwiperListener) { 
     this.mSwiperListener = mSwiperListener; 
    } 

    public static interface SwiperListener { 
     public boolean onLeftSwipe(); 

     public boolean onRightSwipe(); 
    } 

} 
0
private float sumPositionAndPositionOffset; 

@Override 
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
    boolean isSwipeToLeft = position + positionOffset > sumPositionAndPositionOffset; 
    sumPositionAndPositionOffset = position + positionOffset; 
} 
相关问题