天天看點

ListView嵌入ViewPager等橫向滾動控件沖突的終究解決方案

     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);
	}