问题:在viewpager的第一页加入DrawerLayout的时候则会产生左右滑动的冲突
解决思路:
1、当Viewpager滑动到第一页的时候,将Viewpager的右滑禁止掉,这种可以保证DrawerLayout顺利的滑出
2、当DrawerLayout滑出的时候,监听DrawerLayout的滑动事件,滑出完全禁止掉ViewPager的滑动,
当DrawerLayout关闭的时候充值启动ViewPager的滑动
(ps:我也尝试改变事件分发,但还是会有小bug,会的大神可以留言指教下。。。)
代码:
第一步:自定义ViewPager,禁止掉第一页的右滑,同时实现了Viewpager是否允许滑动,调用setNoScroll()即可
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
/**
* 解决ViewPager与DrawerLayout的冲突问题
* 思路:把第一个Fragment的ViewPager的右滑给禁掉
* Created by liuyi on 2015/11/13.
*/
public class MyViewPager extends ViewPager {
private float xDistance, xLast;
private boolean noScroll = false;
public MyViewPager(Context context) {
super(context);
}
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* 禁止第一个frament右滑
*
* @param ev
* @return
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (noScroll) {
return false;
}
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
xDistance = 0f;
xLast = ev.getX();
break;
case MotionEvent.ACTION_MOVE:
final float curX = ev.getX();
//第一个Fragment禁止右滑
if (xLast - curX < 0 && getCurrentItem() == 0) {
return false;
}
//最后一个Fragment禁止左滑
// if (xLast - curX > 0 && getCurrentItem() == 1) {
// return false;
// }
break;
}
return super.onInterceptTouchEvent(ev);
}
@Override
public void scrollTo(int x, int y) {
super.scrollTo(x, y);
}
/**
* 控制Viewpager是否可滑动
*
* @param noScroll : true 不能滑动
*/
public void setNoScroll(boolean noScroll) {
this.noScroll = noScroll;
}
@Override
public boolean onTouchEvent(MotionEvent arg0) {
/* return false;//super.onTouchEvent(arg0); */
if (noScroll)
return false;
else
return super.onTouchEvent(arg0);
}
@Override
public void setCurrentItem(int item, boolean smoothScroll) {
super.setCurrentItem(item, smoothScroll);
}
@Override
public void setCurrentItem(int item) {
super.setCurrentItem(item);
}
}
第二步:监听DrawerLayout的滑动,滑出禁止ViewPager的滑动,滑动重新恢复ViewPager的滑动
//处理Viewpager与DrawerLayout滑动的冲突问题
mDrawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
}
@Override
public void onDrawerOpened(View drawerView) {
//禁止Viewpager的滑动,从而避免与DrawerLayout的冲突
viewpager.setNoScroll(true);
}
@Override
public void onDrawerClosed(View drawerView) {
//解除Viewpager的禁止滑动
viewpager.setNoScroll(false);
}
@Override
public void onDrawerStateChanged(int newState) {
}
});