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

A.R*_*R.H 2 java user-interface android user-experience

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

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

kri*_*son 6

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);

    }
Run Code Online (Sandbox Code Playgroud)

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

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

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

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