近期的项目中,有一个需求要用ViewPager中嵌套ViewPager去实现整个效果。没做不论什么处理做出来后,仅仅能不停的滑动子ViewPager,父ViewPager就无法滑动了,这样肯定是不满足的,分析了一下原因,非常显示是整个滑动事件都被子ViewPager消耗掉了,所以仅仅能对ViewPager做一下自己定义处理。才干够实现。
下面是这个需求实现后的效果图:
从图上就能够看出:我们用ViewPager中嵌套了ViewPager,并且要实现的是子ViewPager滑动到最后一页时,再滑就是滑动父ViewPager.以下将自己定义的ViewPager代码贴出来。大家能够參考下。
/**********************************************************
* @文件名:MyViewPager.java
* @创建时间:2014年11月18日 下午4:24:25
* @改动历史:2014年11月18日创建初始版本号
**********************************************************/
public class MyViewPager extends ViewPager
{
//父ViewPager的引用
private ViewPager viewPager;
private boolean flag = true;
private float mLastMotionX;
public BookstoreViewPager(Context context)
{
super(context);
}
public BookstoreViewPager(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public ViewPager getViewPager()
{
return viewPager;
}
//处理前必须调用此方法初始化冲突ViewPager
public void setViewPager(ViewPager viewPager)
{
this.viewPager = viewPager;
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev)
{
final float x = ev.getX();
switch (ev.getAction())
{
case MotionEvent.ACTION_DOWN:
// 使父控件不处理不论什么触摸事件
viewPager.requestDisallowInterceptTouchEvent(true);
flag = true;
mLastMotionX = x;
break;
case MotionEvent.ACTION_MOVE:
if (flag)
{
if (x - mLastMotionX > 5 && getCurrentItem() == 0)
{
flag = false;
viewPager.requestDisallowInterceptTouchEvent(false); //将事件交由父控件处理
}
if (x - mLastMotionX < -5 && getCurrentItem() == getAdapter().getCount() - 1)
{
flag = false;
viewPager.requestDisallowInterceptTouchEvent(false);
}
}
break;
case MotionEvent.ACTION_UP:
viewPager.requestDisallowInterceptTouchEvent(false);
break;
case MotionEvent.ACTION_CANCEL:
viewPager.requestDisallowInterceptTouchEvent(false);
break;
}
return super.dispatchTouchEvent(ev);
}
}