繁体   English   中英

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

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

我的应用程序中有一个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数量,直到获得所需的效果为止。

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

我为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使用此代码,但是,您需要确定何时首次加载数据。 但是我认为您不会对此有任何疑问。

祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM