如何解决DrawerLayout与Viewpager的滑动冲突

来源:互联网 发布:台球全套教学软件 编辑:程序博客网 时间:2024/06/05 03:27

   

问题:在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) {            }        });






2 0
原创粉丝点击