如何在viewPager页面之间自动切换

Hec*_*tor 20 android uiviewanimation android-viewpager

我有一个Android应用程序,它使用带有两个页面的ViewPager当活动首次显示时,我想依次向用户呈现每个页面,以便他们知道他们可以在两个视图之间滑动.我没有找到任何描述如何执行此操作的文档.我发现PageTransformations听起来很有希望,但用户必须先刷卡.只要ViewPager中的第一页显示,我就需要自动滚动两页.怎样才能达到预期的效果?

Sha*_*zal 62

你可以用它Timer来达到这个目的.以下代码是自解释的:

// ---------------------------------------------------------------------------

Timer timer;
int page = 1;

public void pageSwitcher(int seconds) {
    timer = new Timer(); // At this line a new Thread will be created
    timer.scheduleAtFixedRate(new RemindTask(), 0, seconds * 1000); // delay
                                                                    // in
    // milliseconds
}

    // this is an inner class...
class RemindTask extends TimerTask {

    @Override
    public void run() {

        // As the TimerTask run on a seprate thread from UI thread we have
        // to call runOnUiThread to do work on UI thread.
        runOnUiThread(new Runnable() {
            public void run() {

                if (page > 4) { // In my case the number of pages are 5
                    timer.cancel();
                    // Showing a toast for just testing purpose
                    Toast.makeText(getApplicationContext(), "Timer stoped",
                            Toast.LENGTH_LONG).show();
                } else {
                    mViewPager.setCurrentItem(page++);
                }
            }
        });

    }
}

// ---------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

注意1:确保pageSwitcher在设置adapter到活动的viewPager正确内部onCreate方法后调用方法.

注2:viewPager会刷卡每次启动它的时间.你必须处理它,以便它只浏览所有页面一次(当用户viewPager第一次查看时)

注3:如果您想进一步减慢滚动速度viewPager,可以在StackOverflow上按照这个答案.


如果那对你有帮助,请在评论中告诉我......

  • 如果有人需要无限循环浏览标题,请执行viewPager.setCurrentItem((viewPager.getCurrentItem()+1)%(viewPager.getChildCount()+1)); (2认同)
  • 这会导致内存泄露. (2认同)
  • 在我正在研究的应用程序中查找内存泄漏时,由于使用了TimerTask,这是一个非常糟糕的攻击者.以下是进一步说明:http://www.mopri.de/2010/timertask-bad-do-it-the-android-way-use-a-handler/ (2认同)

Luc*_*eto 33

问题是陈旧但我希望它可以帮助某人使用Runnable我的解决方案

简短的回答

Runnable runnable = new Runnable() {
    public void run() {
        if (myAdapter.getCount() == page) {
            page = 0;
        } else {
            page++;
        }
        viewPager.setCurrentItem(page, true);
        handler.postDelayed(this, delay);
    }
};
Run Code Online (Sandbox Code Playgroud)

长答案 在活动中使用

public class activity extends AppCompatActivity {

    private Handler handler;
    private int delay = 5000; //milliseconds
    private ViewPager viewPager;
    private int page = 0;
    private MyAdapter myAdapter;
    Runnable runnable = new Runnable() {
        public void run() {
            if (myAdapter.getCount() == page) {
                page = 0;
            } else {
                page++;
            }
            viewPager.setCurrentItem(page, true);
            handler.postDelayed(this, delay);
        }
    };

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

        handler = new Handler();
        viewPager = (ViewPager) findViewById(R.id.viewPager);
        myAdapter = new MyAdapter(getSupportFragmentManager());
        viewPager.setAdapter(myAdapter);
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                page = position;
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        handler.postDelayed(runnable, delay);
    }

    @Override
    protected void onPause() {
        super.onPause();
        handler.removeCallbacks(runnable);
    }
}
Run Code Online (Sandbox Code Playgroud)


Tri*_*nea 13

在github上创建了一个开源项目,它实现了一个自动滚动ViewPager,示例图如下: auto srcoll viewPager

使用

<cn.trinea.android.view.autoscrollviewpager.AutoScrollViewPager
    android:id="@+id/view_pager"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
Run Code Online (Sandbox Code Playgroud)

更换

<android.support.v4.view.ViewPager
    android:id="@+id/view_pager"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
Run Code Online (Sandbox Code Playgroud)

打电话 startAutoScroll()开始自动滚动.

stopAutoScroll() 停止自动滚动.

更多:https://github.com/Trinea/android-auto-scroll-view-pager

  • 几乎与[你的答案]重复(http://stackoverflow.com/questions/17167740/android-viewpager-automatically-change-page/22093830#22093830).停止发布重复的答案,而是在此处发布单个并发布已发布的答案链接以供参考. (2认同)