今天主要介绍的是:在Fragment中使用ViewPager,ViewPager的内容依然是多个Fragment。要实现View的滑动效果,就必须不断的改变他的位置,可以通过setLayoutParams,也可以通过scrollTo或者scrollBy,或者
重写控件等,这里我使用的是更简单的setX(float x),就是改变View的X的坐标位置就OK了,十分的方便。
看一下最主要的代码:
[java] view
plaincopy
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没有起作用,虽然执行了,但是没有效果,后面再滑动的时候就会随着手指移动了。
上面代码中判断语句:
[java] view
plaincopy
if(currentIndex>position&&(currentIndex-position)==1)
之所以这样写,是因为如果不添加currentIndex-position==1的判断,从第一个滑到第三个或者第四个,背景图片会出现颤抖的情况,其实这种效果也很不错,要是喜欢,可以把这个&&后面的去掉。