安卓Viewpager弹跳到半页

7

我想要实现的是,用户打开视图页面的第一页后,视图页面会反弹到第二页的一半,然后又反弹回第一页,以表示还有更多页面可以滚动。我想知道如何实现这个功能?

3个回答

21

您可以使用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);

编辑2: ValueAnimator是适用于Api级别11的类。在调用此方法之前,请设置页面适配器。


好的,我已经修复并测试了代码。现在请尝试,参见上面的代码。 - Yuraj
这会导致索引越界,指出索引为0且大小为0。视图翻页器是否应该在特定页面?当前视图翻页器包含5个页面。 - Brown
什么异常?在调用此方法之前,您是否设置了Pager Adapter?ValueAnimator是API级别11。 - Yuraj
我也遇到了崩溃“无效索引0,大小为0”。为了测试目的,我可以通过在单击侦听器中调用该方法来避免崩溃(并确认动画确实起作用),但是理想情况下,当视图创建时自动调用该方法。当我在onViewCreated中调用它时,它会崩溃,有什么想法吗? - user3453281
同时,在动画仍在进行时旋转屏幕会导致它崩溃。 - user3453281
显示剩余6条评论

1

在@Yuraj的答案中添加一条注释。 当hasFocus == true时,请在onWindowFocusChanged 中调用方法,以避免 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);

    }
}

0
谢谢Yuvraj!只需进行简单的修改即可使其正常工作。如果有人遇到“无效索引0,大小为0”的错误,请参考以下简单修复方法。如果您在onCreate()中调用animateViewPager()方法,可能会出现此错误:“无效索引0,大小为0”。我认为在初始化viewPager项目/子项之前已经调用了viewpager.beginFakeDrag();。所以,请延迟一段时间再调用animateViewPager()方法,如下所示:
new Handler().postDelayed(() -> animateViewPager(viewPager, 10, 1000), 500);

500 是以毫秒为单位的延迟时间


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接