如何自动滑动android View Pager

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11698987/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 08:30:34  来源:igfitidea点击:

How to auto slide android View Pager

androidandroid-viewpager

提问by Rasmus

Can a View Pager be made to auto slide or autopage. I have my viewpager set up to use the adapter like the below and it works fine:-

可以将 View Pager 设为自动滑动或自动翻页。我已将我的 viewpager 设置为使用如下所示的适配器,并且工作正常:-

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.gridslide);
ImagePagerAdapter mAdapter = new ImagePagerAdapter(
        getSupportFragmentManager(),4);
ViewPager mPager = (ViewPager) findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
}

And the adapter is like below:-

适配器如下所示:-

public static class ImagePagerAdapter extends FragmentStatePagerAdapter {
private final int mSize;

public ImagePagerAdapter(FragmentManager fm, int size) {
    super(fm);
    mSize = size;
}

@Override
public int getCount() {
    return mSize;
}
@Override
public Fragment getItem(int position) {
    Log.v(TAG,"position="+position);
    return TheFragment.newInstance(position);
}}

However I would want to know how to make these fragments autoslide in a viewpager.

但是我想知道如何使这些片段在 viewpager 中自动滑动。

回答by Raghu

Setting smoothScroll = true in setCurrentItem(int item, boolean smoothScroll) does not always have the smooth scroll effect. Suppose if you have less than 5 pages in you viewpager, you will hardly notice the smooth scroll.

在 setCurrentItem(int item, boolean smoothScroll) 中设置 smoothScroll = true 并不总是具有平滑滚动效果。假设您的 viewpager 中的页面少于 5 页,您几乎不会注意到平滑滚动。

In this scenario, the hard way to do it is to put it in a for loop

在这种情况下,很难做到的方法是将其放入 for 循环中

//This will scroll page-by-page so that you can view scroll happening
for (int i = 0; i < mAdapter.getCount()-1; i++)
    mPager.setCurrentItem(i, true);

If some one needs more slower scroll, they can use postDelayed() like this...

如果有人需要更慢的滚动,他们可以像这样使用 postDelayed() ......

static int i=0;
private final Handler handler = new Handler();
somefunction()
{
    handle.post(ViewPagerVisibleScroll);
}

    Runnable ViewPagerVisibleScroll= new Runnable() {
                @Override
                public void run() {
                    if(i <= mAdapter.getCount()-1)
                    {
                        mPager.setCurrentItem(i, true);
                        handle.postDelayed(TopChartAnimation, 100);
                        i++;
                    }
                }
            };

Sleep is always NOT recommended: If some one needs more slower scroll, they may use a sleep in this for loop...

总是不推荐睡眠:如果有人需要更慢的滚动,他们可能会在这个 for 循环中使用睡眠......

@Override
public void onClick(View v) {
Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    for (int i = 0; i < mAdapter.getCount()-1; i++) {
                        final int value = i;
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                mPager.setCurrentItem(value, true);
                            }
                        });
                    }
                }
            };
            new Thread(runnable).start();

        }

回答by sandrstar

Probably, You should take a look at the following APIs ViewPager.beginFakeDrag(), ViewPager. fakeDragBy(float offset)and ViewPager.endFakeDrag()if You want drag simulation. Also, setCurrentItem()APIs provide ability to set current page and do it smoothly. Simplest way I could suggest to make slide automatically is to setup Handlerwith simple Runnable which would call pager methods for setting item in the activity and just do postDelayed() for it. And don't forget to call removeCallbacks() for it when user interaction or e.g. activity pause.

也许,您应该看看以下 API ViewPager.beginFakeDrag()ViewPager。如果您想要拖动模拟,fakeDragBy(float offset)ViewPager.endFakeDrag()。此外,setCurrentItem()API 提供了设置当前页面并顺利完成的能力。我建议自动制作幻灯片的最简单方法是使用简单的 Runnable设置Handler,它会调用寻呼机方法来设置活动中的项目,并为其执行 postDelayed() 。并且不要忘记在用户交互或例如活动暂停时为其调用 removeCallbacks()。

回答by Suhad Bin Zubair

First Create Slider class extend with TimerTask

首先创建 Slider 类扩展 TimerTask

public class SliderTimer extends TimerTask {
    private ViewPager viewPager;
    private int size;
    private Activity activity;

    public SliderTimer(ViewPager viewPager, int size, Activity activity) {
        this.viewPager = viewPager;
        this.size = size;
        this.activity = activity;
    }

    @Override
    public void run() {
        activity.runOnUiThread(() -> {
            if (viewPager.getCurrentItem() < size - 1) {
                viewPager.setCurrentItem(viewPager.getCurrentItem() + 1, true);
            } else {
                viewPager.setCurrentItem(0, true);
            }
        });
    }
}

Next Create SpeedSlowScroller for slow scrolling

Next 创建 SpeedSlowScroller 用于慢速滚动

public class SpeedSlowScroller extends Scroller {

    private int mDuration = 2500;

    public SpeedSlowScroller(Context context) {
        super(context);
    }

    public SpeedSlowScroller(Context context, Interpolator interpolator) {
        super(context, interpolator);
    }

    public SpeedSlowScroller(Context context, Interpolator interpolator, boolean flywheel) {
        super(context, interpolator, flywheel);
    }


    @Override
    public void startScroll(int startX, int startY, int dx, int dy, int duration) {
        // Ignore received duration, use fixed one instead
        super.startScroll(startX, startY, dx, dy, mDuration);
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy) {
        // Ignore received duration, use fixed one instead
        super.startScroll(startX, startY, dx, dy, mDuration);
    }
}

Finally add SpeedSlowScrollerinto ViewPager, and SliderTimerfor auto scroll

最后将SpeedSlowScroller添加到 ViewPager 和SliderTimer以进行自动滚动

try {
 Field mScroller = ViewPager.class.getDeclaredField("mScroller");
 mScroller.setAccessible(true);
 SpeedSlowScroller scroller = new SpeedSlowScroller(_context);
 mScroller.set(your_viewpager, scroller);
 Timer timer = new Timer();
 timer.scheduleAtFixedRate(new SliderTimer(your_viewpager, models.size(), activity), 4000, 6000);
 } catch (Exception ignored) {
 }