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

时间:2016-11-30 14:57:27

标签: java android user-interface user-experience

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

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

2 个答案:

答案 0 :(得分:3)

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数量,直到获得所需的效果。

答案 1 :(得分:0)

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

我为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,但是,您需要确定第一次加载数据的时间。但我不认为你会遇到问题。

祝你好运!