美文网首页Android 知识
Android:ViewPager画廊效果真循环滑动,(真)首尾

Android:ViewPager画廊效果真循环滑动,(真)首尾

作者: yangSmallXing | 来源:发表于2018-09-28 16:31 被阅读141次

一:实现真无限循环

网上实现ViewPager无限循环的方式大概有两种:

1. 使adapter的getCount()返回Integer.MAX_VALUE,再在初始化时设置当前页面为第几百几千页(如:ViewPager.setCurrentItem(100*data.size));

2. 通过监听viewpager的滑动来设置页面。如当前有数据123,则设置页面为31231,当页面滑动到第一个3时,设置当前页面为第二个3,那么左右都可以滑动,当其滑动到第二个1时同理。

循环:android 打造真正的无限循环viewpager,先看完这篇文章。

画廊效果:ViewPager实现画廊效果,这是画廊效果实现。

这两种方法都有弊端。

第一种方法,ViewPager.setCurrentItem(100*data.size)),如果100*data.size过大,会导致ANR,如果100*data.size过小,会导致用户有可能滑动到尽头。尽管只有1%可能性发生这种情况,那也是我们程序员不容许的。

第二种方法,亲自试过,虽然比在onPageSelected设置跳转好,但是还是有一些问题,当向右滑动时,滑动到尽头,但是此时可能动画还没结束,还不能跳转。但是我们的ViewPager是画廊效果的,导致右边出现空白。

image

这两种方法都有缺点,那么我们需要对这两种方法进行改进。第一种方法没有继续改进的空间。所以我们要对第二种方法进行改进。

改进

ViewPgaer有三页,1 2 3,参考文章中,使得3 1 2 3 1,并且处理了首尾处。但是切换动画还没结束,导致少了一页,显得循环不连贯,所以我们可以补充缺失的页面。所以,2 3 1 2 3 1 2,把缺失的页面加上,就显得循环连贯。因为ViewPager是画廊效果,所以导致了另外一个问题,当快速滑动,跳过了首的3,和尾的1,直接到了我们补充的缺失的页面2,就会使得循环失效。这种情况,我们可以使ViewPager每次滑动只能滑动一页。

二:ViewPager每次滑动只能滑动一页

画廊效果ViewPager的父布局的事件传递给ViewPager处理。

rlContent.setOnTouchListener(new View.OnTouchListener() {

                @Override

                public boolean onTouch(View v, MotionEvent event) {

                    return viewpager.dispatchTouchEvent(event);

                }

            });

所以直接在ViewPager处理事件

  viewpagerp.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        //得到当前点击时,距离屏幕的X坐标
                        x = (int)event.getRawX();
                        break;
                    case MotionEvent.ACTION_MOVE:
                         //如果移动的X轴距离大于某个值,这个值根据需求进行改动
                        if(Math.abs(x - event.getRawX()) > 某个值){
                         //设置事件为MotionEvent.ACTION_UP强行结束该事件
                            event.setAction(MotionEvent.ACTION_UP);
                        }
                        break;
                    case MotionEvent.ACTION_UP:
                         //事件结束,充值x为0
                        x = 0;
                        break;
                }
                return false;
            }
        });

代码注释已经写清楚了。

相关文章

网友评论

    本文标题:Android:ViewPager画廊效果真循环滑动,(真)首尾

    本文链接:https://www.haomeiwen.com/subject/rnupoftx.html