1. 程式人生 > >viewpager實現自動滑動以及手勢滑動功能

viewpager實現自動滑動以及手勢滑動功能

今天在做專案的時候,有一個viewpgaer展示圖片的頁面,第一反應是去網上查詢,後來看了好多文章,其實也就是那麼兩三篇文章,其他的都是轉載來轉載去的,主要就是運用執行緒來進行無限迴圈進行實現的操作,個人感覺並不需要運用到執行緒,尤其是你寫了死迴圈後,執行緒的回收就是個問題,所以就尋思著自己實現功能好了。
先看效果圖吧:
這裡寫圖片描述
實現思路:
在專案裡比較重要的兩個東西,一個是handler的使用,一個是監聽viewpager的觸控事件,具體的思路是設定一個bool值來監聽是否觸控viewpager,我們都知道你如果手動滑動,肯定是要觸控的,我們在觸控的時候把isTouch設定為true,這時候我們手動的把handler裡面的訊息全部清除掉,當action_up的時候,我們在重新向handler裡面傳送資訊,在handler中進行自動滑動的操作,自動滑動的時間間隔是3秒,最後程式碼如下:

hanlder類

handler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                //自動迴圈
                if (!isTouch)
                {
                    int item=msg.what;
                    if (item==2)
                    {

                        viewPager.setCurrentItem(item);
                        item=0
; handler.sendEmptyMessageDelayed(item, 3000); }else { viewPager.setCurrentItem(item); item++; handler.sendEmptyMessageDelayed(item, 3000); } } } }; //傳送第一個自動更換的資訊
handler.sendEmptyMessageDelayed(1, 3000);

viewpager的觸控事件

 viewPager.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                int action = motionEvent.getAction();
                switch (action) {
                    case MotionEvent.ACTION_DOWN:

                        //這裡的操作很重要
                        //從訊息佇列中移除所有message
                        handler.removeMessages(1);
                        handler.removeMessages(2);
                        handler.removeMessages(0);
                        isTouch = true;
                        break;
                    case MotionEvent.ACTION_UP:
                        isTouch = false;
                        //重新發送
                        handler.sendEmptyMessageDelayed(viewPager.getCurrentItem(), 3000);
                        break;
                }
                return false;
            }
        });
 //初始化viewpager
    private void initViewPager(final View view) {

        viewPager = (ViewPager) view.findViewById(R.id.viewpager);
        mainPagerAdapter = new MainPagerAdapter(imageList);
        viewPager.setAdapter(mainPagerAdapter);
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                dotsView.get(position).setBackgroundResource(R.drawable.blue_circle);
                dotsView.get(oldposition).setBackgroundResource(R.drawable.white_circle);
                oldposition = position;
                currentPostion = position;

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

全部程式碼:

//初始化viewpager
    private void initViewPager(final View view) {

        viewPager = (ViewPager) view.findViewById(R.id.viewpager);
        mainPagerAdapter = new MainPagerAdapter(imageList);
        viewPager.setAdapter(mainPagerAdapter);
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                dotsView.get(position).setBackgroundResource(R.drawable.blue_circle);
                dotsView.get(oldposition).setBackgroundResource(R.drawable.white_circle);
                oldposition = position;
                currentPostion = position;

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
        viewPager.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                int action = motionEvent.getAction();
                switch (action) {
                    case MotionEvent.ACTION_DOWN:
                    case MotionEvent.ACTION_MOVE:
                        //從訊息佇列中移除所有message
                        handler.removeMessages(1);
                        handler.removeMessages(2);
                        handler.removeMessages(0);
                        isTouch = true;
                        break;
                    case MotionEvent.ACTION_UP:
                        isTouch = false;
                        //重新發送
                        handler.sendEmptyMessageDelayed(currentPostion, 3000);
                        break;
                }
                return false;
            }
        });
        MainActivity.menu.addIgnoredView(viewPager);
        handler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                //自動迴圈
                if (!isTouch)
                {
                    int item=msg.what;
                    if (item==2)
                    {

                        viewPager.setCurrentItem(item);
                        item=0;
                        handler.sendEmptyMessageDelayed(item, 3000);
                    }else
                    {
                        viewPager.setCurrentItem(item);
                        item++;
                        handler.sendEmptyMessageDelayed(item, 3000);
                    }

                }
            }
        };
        //傳送第一個自動更換的資訊
        handler.sendEmptyMessageDelayed(1, 3000);






    }