2012-12-11 61 views
9

我想知道ViewPager的View已经滚动了一半的屏幕吗?如何知道ViewPager滚动了一半的屏幕android

当我拖动它时,如果它覆盖了一半的屏幕,我想更改页面。

例如,如果我在MDPI上进行测试,即屏幕宽度为320px,并且如果我将ViewPager的页面拖动160px,那么我想更改页面。

如何从ViewPager获得视图覆盖的半个距离?

回答

17

使用OnPageChangeListener的方法。如果用户滚动了一半以上的屏幕,则onPageScrolled方法返回positionOffset> 0.5。 http://developer.android.com/reference/android/support/v4/view/ViewPager.OnPageChangeListener.html

我假设你想要更新一些静态视图,当页面滚动一半的屏幕而无需等待它滚动整页宽度。这是我使用onPageScrolled回调的这个问题的解决方案。

@Override 
public void onPageScrolled(int position , float positionOffset , int positionOffsetPixels) 
{ 
    if (position == mCurrentSelectedScreen) 
    { 
     // We are moving to next screen on right side 
     if (positionOffset > 0.5) 
     { 
      // Closer to next screen than to current 
      if (position + 1 != mNextSelectedScreen) 
      { 
       mNextSelectedScreen = position + 1; 
       updateStaticViewsForScreen(mNextSelectedScreen); 
      } 
     } 
     else 
     { 
      // Closer to current screen than to next 
      if (position != mNextSelectedScreen) 
      { 
       mNextSelectedScreen = position; 
       updateStaticViewsForScreen(mNextSelectedScreen); 
      } 
     } 
    } 
    else 
    { 
     // We are moving to next screen left side 
     if (positionOffset > 0.5) 
     { 
      // Closer to current screen than to next 
      if (position + 1 != mNextSelectedScreen) 
      { 
       mNextSelectedScreen = position + 1; 
       updateStaticViewsForScreen(mNextSelectedScreen); 
      } 
     } 
     else 
     { 
      // Closer to next screen than to current 
      if (position != mNextSelectedScreen) 
      { 
       mNextSelectedScreen = position; 
       updateStaticViewsForScreen(mNextSelectedScreen); 
      } 
     } 
    } 
} 

@Override 
public void onPageSelected(int arg0) 
{ 
    updateStaticViewsForScreen(arg0); 
    mCurrentSelectedScreen = arg0; 
    mNextSelectedScreen = arg0; 
} 
+0

您好oLo:需要您的一些想法我必须在滑动viewpager之前检查,如果存在然后从左到右直接进行。我浪费了很多时间来做这件事,但没有得到完美的结果。提前致谢。 –

0

setonpagechangelistner event on view pager。

MyPagerAdapter adapter = new MyPagerAdapter(getApplicationContext()); 
      myPager = (ViewPager)findViewById(R.id.myfivepanelpager); 
      myPager.setAdapter(adapter); 
      myPager.setCurrentItem(0); 
      myPager.setOffscreenPageLimit(7); 
      myPager.setOnPageChangeListener(new MyPageChangeListener()); 

然后

private class MyPageChangeListener extends ViewPager.SimpleOnPageChangeListener { 

     /* (non-Javadoc) 
     * @see android.support.v4.view.ViewPager.SimpleOnPageChangeListener#onPageSelected(int) 
     */ 
     @Override 
     public void onPageSelected(int position) { 
      focusedPage = position; 

      switch (focusedPage) { 
      case 0: 
       break; 
      case 1: 
           Break; 
} 
} 

在这里你可以得到你当前页面的位置。

+0

抱歉打扰你。我不清楚我的问题。我现在更新它,请再次检查它。谢谢 – Manoj

1

它可以在没有mNextSelectedScreen的情况下实现。做你想要的setPage()

private int mCurrentPage; 

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

    if (position == mCurrentPage) { 
     // It's gone to right. 
     if (positionOffset > 0.5) { 
      setPage(position + 1); 
     } 
     // Not yet. 
     else { 
      setPage(position); 
     } 
    } else { 
     // It's gone to left. 
     if (positionOffset < 0.5) { 
      setPage(position); 
     } 
     // Not yet. 
     else { 
      setPage(position + 1); 
     } 
    } 
} 

@Override 
public void onPageSelected(int position) { 
    mCurrentPage = position; 
    setPage(position); 
} 
4

我同意preious答案,但是当我快速轻扫并释放ViewPager,使用onPageSelected将onPageScrolled之前触发,它会调用updateStaticViewsForScreen 3次,并查看闪烁。 我升级解决方案与记录ViewPager的状态:

@Override 
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) 
{ 
    if(mCurrentPagerState != ViewPager.SCROLL_STATE_SETTLING) 
    { 

      // one of previous code of onPageScrolled   

    } 
} 

@Override 
public void onPageSelected(int position) 
{ 

    // one of previous code of onPageSelected 

} 

@Override 
public void onPageScrollStateChanged(int state) { 
    mCurrentPagerState = state; 
} 
+0

这解决了我的头痛。非常感谢。这会被认为是一个Android的错误? – TigerHix

相关问题