ListView嵌入ViewPager等横向滚动控件冲突的终究解决方案

本文详细介绍了如何解决ListView嵌入滚动控件如ViewPager时出现的手势冲突问题,通过分析现有解决方案的缺陷并提出一种更为可靠的方法来解决此问题。文章提供了解决方案的核心代码,适用于处理ListView与其他需要横向滚动的控件的冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值