1

我有一个ViewPager4 页,我希望它自动滚动。

我正在做的事情 与一个预先计算的整数viewPager.setCurrentItem(index);绑定在一起。TimerTaskindex

逻辑工作正常,但是当它滚动(由 触发setCurrentImte)时,动画太快了。

如何控制它的滚动速度?请注意,我说的是滚动动画速度,而不是 2 次连续滚动的间隔。

4

4 回答 4

2

为什么不使用ViewFlipper呢?ViewFlipper 内置了处理视图之间自动滚动的功能,这意味着您可以转储计时器。此外,它还实现了 ViewAnimator,让您可以完全控制动画。创建自定义动画相对简单,您可以控制动画所需的时间。可以在此处找到幻灯片动画的简单教程。记下动画 xml 文件的持续时间属性。

于 2012-11-13T03:48:59.543 回答
0

看起来ViewPager没有提供这样的 API。我建议执行以下任何操作:

  • 获取 VieWPager 代码(它在您的 android sdk extras 文件夹下)并按照您需要的方式调整它(例如添加必要的 API)。现在它似乎使用内部常量(MAX_SETTLE_DURATION);
  • 自己拦截触摸并调用fakeDragBy()(不确定是否是您要查找的内容);
于 2012-11-13T02:37:06.793 回答
0

为什么不尝试这样的事情呢?使用值动画器为滚动值设置动画,然后更新定位以便正确处理片段加载。对我来说很好:)。

if(pager != null){
        ValueAnimator scrollAnimator = ValueAnimator.ofInt(pager.getScrollX(), pager.getScrollX()+2560);
        final int virtualPage = pager.getCurrentItem();
        scrollAnimator.setDuration(1000);
        scrollAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                pager.setScrollX((Integer)animation.getAnimatedValue());
            }
        });
        scrollAnimator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {
                pager.setCurrentVirtualItem(virtualPage, false);
            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }
        });
        scrollAnimator.start();
    } 
于 2014-01-17T17:23:20.837 回答
0

我对正在开发的应用程序有相同的要求,我的解决方案就是这样。

    Observable.range(1, vpAdapter.getCount() - 1)
            .concatMap(i-> Observable.just(i).delay(5000, TimeUnit.MILLISECONDS))
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(integer -> {
                currentAutoPage = integer;

                binding.vpTour.beginFakeDrag();
                lastFakeDrag = 0;
                ValueAnimator va = ValueAnimator.ofInt(0, binding.vpTour.getWidth());
                va.setDuration(1000);
                va.addUpdateListener(animation -> {
                    if (binding.vpTour.isFakeDragging()) {
                        int animProgress = (Integer) animation.getAnimatedValue();
                        binding.vpTour.fakeDragBy(lastFakeDrag - animProgress);
                        lastFakeDrag = animProgress;
                    }
                });
                va.addListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        super.onAnimationEnd(animation);
                        if (binding.vpTour.isFakeDragging()) {
                            binding.vpTour.endFakeDrag();
                        }
                    }
                });
                va.start();
            }, Throwable::printStackTrace, () -> {
                if (autoPageChangeDisposable != null && !autoPageChangeDisposable.isDisposed()) {
                    autoPageChangeDisposable.dispose();
                }
            });

如果您还想在用户手动更改页面时停止自动滑动,而不仅仅是从我编写的代码中获取一次性用品,例如:“Disposable autoPageChangeDisposable = Observable.range(1, vpAdapter ....”然后注册和 OnPageChangedListener 并执行此操作:

        vpTour.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                if (position != currentAutoPage) {
                    if (autoPageChangeDisposable != null && !autoPageChangeDisposable.isDisposed()) {
                        autoPageChangeDisposable.dispose();
                    }
                }
            }
        });
于 2017-10-06T11:46:57.907 回答