viewpager自动滚动太快

时间:2012-11-13 02:27:51

标签: android android-viewpager

我有一个ViewPager有4页,我想让它自动滚动。

我正在做的是viewPager.setCurrentItem(index);TimerTask绑定,其中index是预先计算的整数。

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

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

看起来ViewPager没有提供这样的API。我建议你做以下任何事情:

  • 使用VieWPager代码(它位于您的android sdk extras文件夹下)并以您需要的方式调整(例如添加必要的API)。现在它似乎使用内部常量(MAX_SETTLE_DURATION);
  • 自己拦截触摸并致电fakeDragBy()(不确定它是否正在寻找);

答案 2 :(得分: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();
    } 

答案 3 :(得分: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();
                    }
                }
            }
        });