23

2 つのページを持つ ViewPager を使用する Android アプリケーションがあります。アクティビティが最初に表示されるときに、各ページをユーザーに順番に表示して、2 つのビュー間でスワイプできることをユーザーに知らせたいと思います。これを行う方法を説明しているドキュメントは見つかりませんでした。私は有望に聞こえる PageTransformations を発見しましたが、ユーザーは最初にスワイプする必要があります。ViewPager の最初のページが表示されるとすぐに、2 つのページを自動的にスクロールする必要があります。どうすれば望ましい結果を達成できますか?

4

9 に答える 9

71

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++);
                }
            }
        });

    }
}

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

注 1:アクティビティの内部メソッドを適切pageSwitcherに設定した後、必ずメソッドadapterを呼び出してください。viewPageronCreate

注 2:は、viewPager起動するたびにスワイプします。すべてのページを 1 回だけスワイプするように処理する必要があります (ユーザーがviewPager初めて表示するとき) 。

注 3:のスクロール速度をさらに遅くしたい場合は、 StackOverflow でこの回答に従うviewPagerことができます。


それがあなたを助けることができなかった場合は、コメントで教えてください...

于 2013-07-12T10:02:43.980 に答える
37

質問は古いですが、Runnableを使用した私のソリューションが誰かに役立つことを願っています

簡潔な答え

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

長文回答 アクティビティでの使用

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);
    }
}
于 2016-06-24T22:02:51.477 に答える
2

以下の方法は、しばらくすると自動的にページを切り替えるために使用されます(要件に応じて時間を変更できます)

 private void timer() {
                timer = new Timer();
                timer.scheduleAtFixedRate(new TimerTask() {
                    @Override
                    public void run() {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                if (currentPage == NUM_PAGES - 1) {
                                    currentPage = 0;
                                }
                                view.setCurrentItem(currentPage++, true);
                            }
                        });
                    }
                }, 500, 5000);
            }

ビューページャーで無限にスクロールしたい場合は、以下の提供されたリンクから無限スクロール ビューページャー クラスを使用し、Runnable インターフェイスでマイナーな変更 (条件の削除) を行います。

runOnUiThread(new Runnable() {
                                @Override
                                public void run() {

                                    view.setCurrentItem(currentPage++, true);
                                }
                            });

また、Destroy ビューでタイマーをキャンセルすることを忘れないでください。

于 2017-01-23T10:42:05.857 に答える
0

ビューページャーページを自動再生したいが、何よりも解決策は正しいが、最初のアイテムの自動再生後に遅延時間がかかるが、現在のアイテムの自動再生後にすぐに切り替える場合は間違っています。以下にコードを追加していますが、自動再生/一時停止が正しく機能しています。

        @Override
        public void onClick(View v) {

            if (!isAutoPlay) {              
                img_autoplay.setImageResource(R.drawable.pause);
                int currentcount = getModel().getCurrentIndex();
                currentcount++;
                getMainImage().setCurrentItem(currentcount);
                autoPlay(getMainImage());
                isAutoPlay = true;
            } else {
                img_autoplay.setImageResource(R.drawable.auto_play);
                isAutoPlay = false;
            }
        }
    });

そしてここに方法があります:

    viewPager.postDelayed(new Runnable() {
        @Override
        public void run() {
            try {
                if (myAdapter != null
                        && viewPager.getAdapter().getCount() > 0
                        && isAutoPlay) {
                    getWindow().addFlags(
                            WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
                    int currentcount = getModel().getCurrentIndex();
                    currentcount++;
                    viewPager.setCurrentItem(currentcount);

                    if (getModel().isLastCard()) {
                        final Handler handler = new Handler();
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                isAutoPlay = false;
                                packFinished();
                                getWindow()
                                        .clearFlags(
                                                WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
                            }
                        }, 6000);
                    }
                    autoPlay(viewPager);
                }
            } catch (Exception e) {

            }
        }
    }, 6000);
于 2015-10-19T06:05:30.960 に答える