您的位置:首页 > 其它

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

2015-12-30 15:48 405 查看
问题:在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) {

            }
        });
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: