如何在Fragment中使用ViewPager,并实现导航随手势滑动效果

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013758734/article/details/43197659

看了之前自己的一篇文章,感觉写的不够好,今天推荐一个更好的实现ViewPager导航,比以前的那个帅多了,而且简单多了!可惜CSDN没有删除博客的权限,否则就删除了。以前的文章:http://blog.csdn.net/u013758734/article/details/29848117


今天主要介绍的是:在Fragment中使用ViewPager,ViewPager的内容依然是多个Fragment。本文参考了:http://www.tuicool.com/articles/E7n6vu  不过原文中的方法对于我的实际情况还是有点不合适的,出了点问题,下面再说。


要实现View的滑动效果,就必须不断的改变他的位置,可以通过setLayoutParams,也可以通过scrollTo或者scrollBy,或者重写控件等,这里我使用的是更简单的setX(float x),就是改变View的X的坐标位置就OK了,十分的方便。

看一下最主要的代码:

mPageVp.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

			@Override
			public void onPageSelected(int position) {
				currentIndex = position;
			}

			@Override
			public void onPageScrolled(int position, float offset,
					int offsetPixels) {
				if(currentIndex>position&&(currentIndex-position)==1)
				{
					int xOffset = (int) (-(1 - offset)
							* (screenWidth * 1.0 /pageNum) + currentIndex
							* (screenWidth /pageNum));
					rlOverlay.setX(xOffset);
				}else if(currentIndex==position)
				{
					int xOffset = (int) (offset * (screenWidth * 1.0 /pageNum) + currentIndex
							* (screenWidth /pageNum));
					rlOverlay.setX(xOffset);
				}
			}

			@Override
			public void onPageScrollStateChanged(int state) {
				//在这里来改变被选中的item的高亮样式
			}
		});


可以看到上面根据currentIndex以及position的变化,不断的计算View的X对应要滑动到的位置,currentIndex是当前选中的item索引,position是ViewPager滑动时显示的视图的索引。

看一下效果图:


现在来说一下如果通过setLayoutParams会出现什么问题,如果是通过这种方式,那么当你切换到这个Fragment时,初始化的时候即使你通过setCurrentItem(2)来设置默认显示第三个子fragment,导航栏中的蓝色背景依然停留在第一个导航处,到那时下面的内容显示是第三个。另外你第一次通过手指切换内容视图的时候,上面的蓝色背景不会随着手指一动,只有页面切换完成,他才会移动,就是在ViewPager滚动过程中,setLayoutParams没有起作用,虽然执行了,但是没有效果,后面再滑动的时候就会随着手指移动了。


上面代码中判断语句:

if(currentIndex>position&&(currentIndex-position)==1)

之所以这样写,是因为如果不添加currentIndex-position==1的判断,从第一个滑到第三个或者第四个,背景图片会出现颤抖的情况,其实这种效果也很不错,要是喜欢,可以把这个&&后面的去掉。


其实写这么多我知道也没人看,下面是源码地址:

https://github.com/kidloserme/ViewPagerSlide




猜你喜欢

转载自blog.csdn.net/u013758734/article/details/43197659