ViewPager自动轮播时触摸的方便解决

  • ViewPager做自动轮播相信大家都会的。思路五花八门的,之前看到郭霖的博客,他就完全不使用ViewPager,去自己自定义一个View来做。
  • 但是,我当然做不到这样。我的实现方式就是:
    • 1.在ViewPager第一次显示的时候(onCreate/onCreateView中)就用Handler去执行一个延时任务,延时假设2秒,然后去选中下一页。

      mHandler.postDelayed(new Runnable() {
      @Override
      public void run() {
      vPager.setCurrentItem(vPager.getCurrentItem() + 1);
      }
      }, 2000);
    • 2.实现ViewPagerViewPager.OnPageChangeListener接口,然后比如需要重写3个抽象方法,其中,在onPageSelected(int position)方法中再次执行相同的延时任务,依然是使用Handler去实现。
  • 经过以上两步就实现了ViewPager的自动轮播了。当然,前提是先设置成无限轮播。关于无限轮播,相信大家也都会的吧。
    • 关于无限轮播,我也简单说一下我的实现思路:
      • 1.在给ViewPager设置PagerAdapter的时候,重写getCount()的时候,直接return Integer.MAX_VALUE;
      • 2.在PagerAdapterinstantiateItem(ViewGroup container, int position)的时候要特别注意,数据的获取,不要越界了。比如,我这样做就不会越界了ImageView iv = new ImageView(context);
        iv.setImageResource(data.get(position % data.size()));
      • 3.好了PagerAdapter中只要关注1,2两点即可。然后就是在第一次进入的时候需要设置当前选中的页,一定是一个中间值,而不是第一页,比如我这样设置的:vPager.setCurrentItem(Integer.MAX_VALUE / 2 - (Integer.MAX_VALUE / 2)
        % vpagerDatas.size());
  • Ok,关于无限轮播的小插曲就这样子了,不必过多介绍的吧。
  • 然后就是一个头疼的问题,就是在ViewPager自动轮播的时候,手指触摸,手动滑动怎么处理?
  • 我在网上看了很多的博客,真没有感觉实现的很好的,有的根本就没有去处理,有的处理了,但是感觉很复杂,看不太懂,不好移植。
  • 这里,我就分享一下我的处理方式,自认为是我看到的所有博客中,最简单的一种方式,当然,也是看到了网上的博客给了我一些启发的,处理起来就一行代码。
  • 只要在ViewPager.OnPageChangeListener.onPageScrollStateChanged(int state)的这里里面做一下处理就好了。
@Override
    public void onPageScrollStateChanged(int state) {
        switch (state) {
        case ViewPager.SCROLL_STATE_DRAGGING://手指滑动状态
            mHandler.removeCallbacksAndMessages(null);
            break;
        case ViewPager.SCROLL_STATE
        IDLE://停止状态

            break;
        case ViewPager.SCROLL_STATE_SETTLING://自动滑动状态

            break;

        default:
            break;
        }
    }
  • 说白了就是在ViewPager.SCROLL_STATE_DRAGGING://手指滑动状态,去取消Handler的延时翻页的任务就可以了。

    • 有人可能会担心,这样做会不会导致手指离开之后,后面也不会自动轮播了呢?
      • 不会的。因为在手指离开之后,又会走到页面选中的回调,到时候,又会发起一个延时翻页的任务。

  • 总结:通过Handler首次发起延时翻页任务+在ViewPager.OnPageChangeListener.onPageSelected(int position)中实现页面选中后,再次发起延时翻页的任务来进行的无限轮播 的 触摸处理可以是: 在ViewPager.SCROLL_STATE_DRAGGING://手指滑动状态,去取消Handler的延时翻页的任务。

  • 最后,因为这么项目里面包含很多无关的内容,暂时就不上传Demo了。
    `
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值