解决SlidingMenu 侧滑与ViewPager冲突问题

由于使用了Github上的开源项目,开始以为需要自己在CustomViewAbove中改写OnInterceptTouchEvent(MotionEvent ev);

参看了一下百度视频App,发现它在首页里的ViewPager控件在下拉后,只有上面部分可以响应左右滑动事件,下面的部分却不可以,于是我猜想它把上面部分写死了,先调用view.getHitRect(rect)来获得viewpager的矩形框位置,然后,判断触摸的点是否在矩形框内。


Rect rect = new Rect();  
viewPager.getHitRect(rect);  
if(rect.contains(event.getX(), event.getY())  
       return false;  

本以为要自己写的。后来在查看CustomViewAbove的OnInterceptTouchEvent(MotionEvent ev)方法时,看到有个方法thisTouchAllowed(ev);


case MotionEvent.ACTION_DOWN:  
                mActivePointerId = ev.getAction() & ((Build.VERSION.SDK_INT >= 8) ? MotionEvent.ACTION_POINTER_INDEX_MASK : MotionEvent.ACTION_POINTER_INDEX_MASK);  
                mLastMotionX = mInitialMotionX = MotionEventCompat.getX(ev, mActivePointerId);  
                mLastMotionY = MotionEventCompat.getY(ev, mActivePointerId);  
                if (thisTouchAllowed(ev)) {  
                    mIsBeingDragged = false;  
                    mIsUnableToDrag = false;  
                    if (isMenuOpen() && mViewBehind.menuTouchInQuickReturn(mContent, mCurItem, ev.getX() + mScrollX)) {  
                        mQuickReturn = true;  
                    }  
                } else {  
                    mIsUnableToDrag = true;  
                }  
                break;  


于是展开去看


private boolean thisTouchAllowed(MotionEvent ev) {  
        int x = (int) (ev.getX() + mScrollX);  
        if (isMenuOpen()) {  
            return mViewBehind.menuOpenTouchAllowed(mContent, mCurItem, x);  
        } else {  
            switch (mTouchMode) {  
            case SlidingMenu.TOUCHMODE_FULLSCREEN:  
                return !isInIgnoredView(ev);  
            case SlidingMenu.TOUCHMODE_NONE:  
                return false;  
            case SlidingMenu.TOUCHMODE_MARGIN:  
                return mViewBehind.marginTouchAllowed(mContent, x);  
            }  
        }  
        return false;  
    }  

居然后有个方法,isInIgnoreView(),如果不在忽略的View中,就会返回true传给CustomViewAbove自己的onTouchEvent()来消费该事件,于是猜想是不是有个方法可以可以把slidingMenu把想忽视侧滑这一触摸事件的View加入判断中,


private boolean isInIgnoredView(MotionEvent ev) {  
        Rect rect = new Rect();  
        for (View v : mIgnoredViews) {  
            v.getHitRect(rect);  
            if (rect.contains((int) ev.getX(), (int) ev.getY()))  
                return true;  
        }  
        return false;  
    } 

原来mIgnoredViews是一个ArrayList<View>,而且还有一个这样的方法。


public void addIgnoredView(View v) {  
        if (!mIgnoredViews.contains(v)) {  
            mIgnoredViews.add(v);  
        }  
    }  

SlidingMenu类中又调用了CustomViewAbove的addIgnoreView()


/** 
     * Add a View ignored by the Touch Down event when mode is Fullscreen 
     *  
     * @param v 
     *            a view to be ignored 
     */  
    public void addIgnoredView(View v) {  
        mViewAbove.addIgnoredView(v);  
    }  

于是找到解决办法了,如果是MainActivity继承SlidingFragmentActivity的这种情况,可以做如下处理:


public static SlidingMenu mSlidingMenu = getSlidingMenu();  


在自己定义的Fragment中:


ActMain.mSlidingMenu.addIgnoredView(viewPager);

对于在第一页想实现侧滑功能可以动态的进行ignoreView的设置,Viewpager非第一页的时候,设置为ignore,Viewpager第一页的时候remove掉


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值