如何手动smoothScrollTo()ViewPager上的片段视图

时间:2014-09-04 14:10:11

标签: android android-fragments android-viewpager

我正在开发一个循环ViewPager,我已经实现了这个完全解决方案(https://stackoverflow.com/a/12965787/1083564)。

唯一缺少的是,当我使用setCurrentItem(int i,bol b)方法时,我需要smoothScroll,它立即进入像素限制,而不使用smoothScroll。

我已经有权使用此方法,使用以下代码:

package android.support.v4.view;

import android.content.Context;
import android.util.AttributeSet;

public class MyViewPager extends ViewPager {

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

    public MyViewPager(Context context, AttributeSet attr) {
        super(context, attr);
    }

    public void smoothScrollTo(int x, int y, int velocity) {
        super.smoothScrollTo(x, y, velocity);
    }

}

但我无法弄清楚在哪里以及如何使用它。我在ViewPager上的setOnPageChangeListener中使用此代码,我需要运行平滑的像素数:

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    Log.d( "viewpager", positionOffsetPixels+"");
}

在它变为0之前,由于setCurrentItem,我立即得到像素值到达0(向左)或x(向右,取决于屏幕)。我不知道怎样才能得到这个x号。

PS:我认为这个解决方案是IMDB应用程序使用的解决方案。您可以看到此滚动从第一个滚动到最后一个而不是一个滚动,而不会移开您的手指(使用2个手指来执行此操作)。您将看到“白色限制”将显示在ViewPager的左侧。唯一的区别是他们知道在使用setCurrentItem之后如何平滑滚动。

如果您需要更多信息,请询问!谢谢!

2 个答案:

答案 0 :(得分:3)

问题:当您检测到必须执行循环滚动时,立即调用setCurrentItem将导致ViewPager立即滚动到真实片段而不会平滑滚动,因为它设置为false。

解决方案:相反,允许ViewPager像其他片段一样平滑地滚动到假片段,然后在平滑滚动设置为false的一段延迟后滚动到真实片段。用户不会注意到更改。

当我们执行循环滚动时,请在运行中调用setCurrentItem并延迟一些。使用onPageSelected了解所选页面的索引。

public void onPageSelected(int position) {

    // Consider eg. : C' A B C A'

    boolean circularScroll = false;
    if(position == 0) {
        // Position 0 is C', we need to scroll to real C which is at index 3. 
        position = mPager.getAdapter().getCount() - 2;
        circularScroll = true;
    }

    int lastIndex = mPager.getAdapter().getCount() - 1;
    if(position == lastIndex) {
        // Last index is A', we need to scroll to real A, which is at index 1. 
        position = 1;
        circularScroll = true;
    }

    if(circularScroll) {
        final int realPosition = position;
        mPager.postDelayed(new Runnable() {

            @Override
            public void run() {
                mPager.setCurrentItem(realPosition, false);
            }

        }, 500L);
    }
}

答案 1 :(得分:0)

当你将setCurrentItem的第二个参数设置为true时,它应该平滑滚动

@Override
public void onPageScrollStateChanged (int state) {
    if (state == ViewPager.SCROLL_STATE_IDLE) {
        int curr = viewPager.getCurrentItem();
        int lastReal = viewPager.getAdapter().getCount() - 2;
        if (curr == 0) {
            viewPager.setCurrentItem(lastReal, true);
        } else if (curr > lastReal) {
            viewPager.setCurrentItem(1, true);
        }
    }
}