ListView嵌入ViewPager等橫向滾動控件,會導緻ViewPager左右撥動和ListView手勢沖突。按經驗(Gallery中的子視圖處理Click事件)隻要比對滑動的X坐标大于Y坐标,就交由ViewPager處理,應該是個簡單的問題。實際search到的比較火方案的思路是用SimpleOnGestureListener的onScroll回調中判斷X、Y坐标撥動絕對值是否攔截,不過這個到處轉載的方案是有很多問題的(比如撥動不靈敏、上下撥有問題),那些轉載的是腦子被爐踢了嗎?
最後在stackoverflow看到一個解決方法,思路除了考慮X、Y坐标還考慮到了down、move事件的配合,比較靠譜結果試試效果不錯。下面是核心代碼,完整實作請參考附件(這種實作可以同樣可以處理ListView嵌入ViewFlow、ViewFlipper、HorizontalScrollView等需要橫向滾動的控件)
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN :
mDX = mDY = 0f;
mLX = ev.getX();
mLY = ev.getY();
break;
case MotionEvent.ACTION_MOVE :
final float X = ev.getX();
final float Y = ev.getY();
mDX += Math.abs(X - mLX);
mDY += Math.abs(Y - mLY);
mLX = X;
mLY = Y;
if (mIntercept && mLastAct == MotionEvent.ACTION_MOVE) {
return false;
}
if (mDX > mDY) {
mIntercept = true;
mLastAct = MotionEvent.ACTION_MOVE;
return false;
}
}
mLastAct = ev.getAction();
mIntercept = false;
return super.onInterceptTouchEvent(ev);
}