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

来源:互联网 发布:整形网络咨询招聘 编辑:程序博客网 时间:2024/04/29 05:48

转自:http://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了,十分的方便。

看一下最主要的代码:

[java] view plaincopy
  1. mPageVp.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {  
  2.   
  3.             @Override  
  4.             public void onPageSelected(int position) {  
  5.                 currentIndex = position;  
  6.             }  
  7.   
  8.             @Override  
  9.             public void onPageScrolled(int position, float offset,  
  10.                     int offsetPixels) {  
  11.                 if(currentIndex>position&&(currentIndex-position)==1)  
  12.                 {  
  13.                     int xOffset = (int) (-(1 - offset)  
  14.                             * (screenWidth * 1.0 /pageNum) + currentIndex  
  15.                             * (screenWidth /pageNum));  
  16.                     rlOverlay.setX(xOffset);  
  17.                 }else if(currentIndex==position)  
  18.                 {  
  19.                     int xOffset = (int) (offset * (screenWidth * 1.0 /pageNum) + currentIndex  
  20.                             * (screenWidth /pageNum));  
  21.                     rlOverlay.setX(xOffset);  
  22.                 }  
  23.             }  
  24.   
  25.             @Override  
  26.             public void onPageScrollStateChanged(int state) {  
  27.                 //在这里来改变被选中的item的高亮样式  
  28.             }  
  29.         });  


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

看一下效果图:


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


上面代码中判断语句:

[java] view plaincopy
  1. if(currentIndex>position&&(currentIndex-position)==1)  

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


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

https://github.com/kidloserme/ViewPagerSlide


0 0