15

ViewPagerビューが画面の半分までスクロールしたかどうか知りたいですか?

ドラッグしているときに、画面の半分が表示されている場合は、ページを変更します。

たとえば、MDPI、つまり画面幅が320pxでテストしていて、ViewPagerのページを160pxドラッグした場合、ページを変更したいとします。

ViewPagerからのビューでこの半分の距離をカバーするにはどうすればよいですか?

4

4 に答える 4

23

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;
}
于 2013-01-01T15:33:20.047 に答える
4

以前の回答に同意しますが、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;
}
于 2015-06-05T09:02:51.757 に答える
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);
}
于 2015-03-17T09:09:21.343 に答える
0

ビューページャーのsetonpagechangelistnerイベント。

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

ここで、現在のページの位置を取得できます。

于 2012-12-11T12:09:09.073 に答える