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






    }

你可能感兴趣的:(android,开发)