如何摇动 ViewPager 以向用户显示有更多页面可用?

How can I shake ViewPager to show the user that there are more pages available?

我的应用程序中有一个 ViewPager,我希望它在第一次加载时摇晃。这是为了向用户显示有更多页面可用。我怎样才能以编程方式实现这一点?

但是,我不希望寻呼机自动滚动到下一页。

如果你想摇晃它,你可以使用动画。

我为 FloatingActionButton 做了同样的事情,而且效果很好。

对于 ViewPager 查看此代码:

ObjectAnimator shakeAnimation=ObjectAnimator.ofFloat(yourViewPager,View.TRANSLATION_X,-25f,25f);
                                        shakeAnimation.setDuration(100);
                                        shakeAnimation.setRepeatCount(2);
                                        shakeAnimation.addListener(new AnimatorListenerAdapter() {
                                            @Override
                                            public void onAnimationEnd(Animator animation) {
                                                super.onAnimationEnd(animation);
                                                yourViewPager.setTranslationY(0f);
                                            }
                                        });
                                        shakeAnimation.start();

您可以根据需要调整翻译,在我的例子中它只是[-25,25]。您还可以设置动画的持续时间和重复次数。

您可以在首次加载数据时为您的ViewPager使用此代码,但是,您需要确定首次加载数据的时间。但我认为你不会有问题。

祝你好运!

ViewPager 有一个以编程方式滑动的方法:fakeDragBy

https://developer.android.com/reference/android/support/v4/view/ViewPager.html#fakeDragBy(float)

以下是实现此目标的方法:

  • 致电viewPager.beginFakeDrag()
  • 启动动画师。在 AnimatorUpdateListener 覆盖 onAnimationUpdate 所以它调用 viewPager.fakeDragBy()
  • AnimatorListener 重写 onAnimationEnd 中调用 viewPager.endFakeDrag() 在此调用之后,ViewPager 应该回到初始页面。

vpaliyX 使用翻译的回答不会显示下一页。您需要使用 fakeDragBy 以便用户可以短暂地看到下一页的边缘。


根据要求,这是一个代码片段:

    private float drag;

    ...

    @Override
    protected void onResume() {
        super.onResume();
        mViewPager.postDelayed(new Runnable() {
            @Override
            public void run() {
                mViewPager.beginFakeDrag();
                drag = 0;
                float density = getResources().getDisplayMetrics().density;
                // 120 is the number of dps you want the page to move in total
                ValueAnimator animator = ValueAnimator.ofFloat(0, 120 * density);
                animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator valueAnimator) {
                        float progress = (float) valueAnimator.getAnimatedValue();
                        mViewPager.fakeDragBy(drag - progress);
                        drag = progress;
                    }
                });
                animator.addListener(new Animator.AnimatorListener() {
                    @Override
                    public void onAnimationStart(Animator animator) { }

                    @Override
                    public void onAnimationEnd(Animator animator) {
                        mViewPager.endFakeDrag();
                    }

                    @Override
                    public void onAnimationCancel(Animator animator) { }

                    @Override
                    public void onAnimationRepeat(Animator animator) { }
                });
                animator.setDuration(400);
                animator.start();
            }
        }, 300);

    }

我设置了 300 毫秒的启动延迟。我真的不知道是否有必要。

注意表达式 drag - progress,它给出了一个负数。要向左滑动,您必须使用负值。

另请注意,我没有包含任何代码来确定这是否是第一次打开该应用程序。

您可以调整开始延迟、动画持续时间和滑动的 dps 数,直到获得您想要的效果。