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

标签 java android user-interface user-experience

我的应用程序中有一个 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 以便用户可以短暂地看到下一页的边缘。


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

    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 数,直到获得您想要的效果。

关于java - 如何摇动 ViewPager 以向用户显示有更多页面可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40891495/

相关文章:

java - 在不更改默认 Java 的情况下安装 Oracle JRE 的最佳方法?

android - 在开发 Android 应用程序时如何管理多个环境?

command-line - 关于实现命令行界面的建议

Java swing - 从 gui 接收内部类的字符串或整数

java - 使用 Oracle SQL Developer 测试 UCanAccess -> ODBC 错误

java - 来自 smb 的 Camel - 组合 "delete=true"并按文件名过滤

java - 如何通过共享首选项保存菜单项可见性状态?

java - 安排 Activity 日历的最佳 Swing 解决方案

java - Java动态生成按钮

java - Android GridView 与图像和文本