2012-12-02 71 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; 
} 
相關問題