由于使用了Github上的開源項目,開始以為需要自己在CustomViewAbove中改寫OnInterceptTouchEvent(MotionEvent ev);
參看了一下百度視訊App,發現它在首頁裡的ViewPager控件在下拉後,隻有上面部分可以響應左右滑動事件,下面的部分卻不可以,于是我猜想它把上面部分寫死了,先調用view.getHitRect(rect)來獲得viewpager的矩形框位置,然後,判斷觸摸的點是否在矩形框内。
<span style="margin: 0px; padding: 0px; border: 0px; background: transparent;"> </span>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 (<span style="margin: 0px; padding: 0px; border: 0px; color: rgb(255, 0, 0); background: transparent;">thisTouchAllowed(ev)</span>) {
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 <span style="margin: 0px; padding: 0px; border: 0px; color: rgb(255, 0, 0); background: transparent;">!isInIgnoredView(ev)</span>;
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); <span style="margin: 0px; padding: 0px; border: 0px; font-family: Arial, Helvetica, sans-serif; background: transparent;"> </span>
大功告成!