Android Viewpager反弹到半页

Android Viewpager反弹到半页,android,android-viewpager,android-animation,Android,Android Viewpager,Android Animation,因此,我试图实现的是,用户将打开查看页面的第一页,查看页面将反弹到第二页的一半,并反弹到第一页,表明有更多页面可滚动。我想知道我怎样才能实现这一点 您可以使用fakeDragBy方法来实现此效果: viewPager.beginFakeDrag(); viewPager.fakeDragBy(offset); //offset in pixels. viewPager.endFakeDrag(); 编辑: 我为此制定了一个方法: private int animFactor; private

因此,我试图实现的是,用户将打开查看页面的第一页,查看页面将反弹到第二页的一半,并反弹到第一页,表明有更多页面可滚动。我想知道我怎样才能实现这一点

您可以使用fakeDragBy方法来实现此效果:

viewPager.beginFakeDrag();
viewPager.fakeDragBy(offset); //offset in pixels. 
viewPager.endFakeDrag();
编辑:

我为此制定了一个方法:

private int animFactor;
private ValueAnimator animator = new ValueAnimator();

private void animateViewPager(final ViewPager pager, final int offset, final int delay) {
    if (!animator.isRunning()) {
        animator.removeAllUpdateListeners();
        animator.removeAllListeners();
        //Set animation
        animator.setIntValues(0, -offset);
        animator.setDuration(delay);
        animator.setRepeatCount(1);
        animator.setRepeatMode(ValueAnimator.RESTART);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            public void onAnimationUpdate(ValueAnimator animation) {
                Integer value = animFactor * (Integer) animation.getAnimatedValue();
                if (!pager.isFakeDragging()) {
                    pager.beginFakeDrag();
                }
                pager.fakeDragBy(value);
            }
        });
        animator.addListener(new AnimatorListenerAdapter() {

            @Override
            public void onAnimationStart(Animator animation) {
                animFactor = 1;
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                pager.endFakeDrag();
            }

            @Override
            public void onAnimationRepeat(Animator animation) {
                animFactor = -1;
            }
        });
        animator.start();
    }
}
用法示例:

animateViewPager(pager, 10, 1000);

Edit2:ValueAnimator是Api级别11的类。在调用此方法之前,还要设置寻呼机适配器。

为@Yuraj的答案添加注释。当
hasFocus==true
时,按如下方式调用WindowFocusChanged中的方法,以避免
indexOutOfBoundsException

@Override
public void onWindowFocusChanged(boolean hasFocus) 
{
    super.onWindowFocusChanged(hasFocus);

    if(hasFocus)
    {
        Handler handler = new Handler();

        final Runnable r = new Runnable() 
        {
            public void run() 
            {
                if(mViewPager.getCurrentItem() == 0)
                {
                    Context context = Activity_main.this;
                    String filename="Init";
                    SharedPreferences stats;
                    stats = context.getSharedPreferences(filename, 0); 
                    int appOpen = stats.getInt("appOpen", 0);

                    if(appOpen <= 5)
                    {
                        animateViewPager(mViewPager, 10, 300);

                        appOpen += 1;
                        SharedPreferences.Editor editor = stats.edit();
                        editor.putInt("appOpen", appOpen);
                        editor.commit();
                    }
                }
            }
        };

        handler.postDelayed(r, WAIT_VIEWPAGER_NUDGE);

    }
}
@覆盖
WindowFocusChanged上的公共无效(布尔hasFocus)
{
super.onWindowFocusChanged(hasFocus);
如果(hasFocus)
{
Handler=newhandler();
最终可运行r=新可运行()
{
公开募捐
{
如果(mViewPager.getCurrentItem()==0)
{
Context=Activity\u main.this;
字符串filename=“Init”;
共享参考数据统计;
stats=context.getSharedReferences(文件名,0);
int appOpen=stats.getInt(“appOpen”,0);

如果(我已经测试过了,它只会导致崩溃,说beginFakeDrag没有被调用,当我进行偏移时,它根本不会移动viewpager,即使在调用beginFakeDrag和endFakeDragOk时,我已经修复并测试了代码。现在试试,请参阅上面的代码。这会导致索引越界,说明索引为0,大小为0。是否应该使用视图页面在特定页面?当前视图寻呼机由5个页面组成。它对我来说也崩溃了。索引超出了界限。我正在调用onCreate方法。什么异常?在调用此方法之前是否设置了寻呼机适配器?ValueAnimator是api级别11。