【安卓】给gallery内"控件"挂载事件,滑动后抬起手指时也触发事件(滑动时不应触发)的解决、!

思路:

1.gallery内控件挂载事件(如:onClickListener)的方法类似listview,可直接在baseAdapter.getView内给控件挂载(具体方法百度)。

2.貌似没问题,但滑动后(手指在挂载了事件的控件上)抬起手指时仍会触发事件,这是不对的。

解决方法时,若为滑动(x有偏移),则在gallery.onInterceptTouchEvent中拦截事件,子控件自然接受不到事件。

注:1>不能简单的判断x有偏移就拦截,有些设备犯贱,即使原地抬起也有可能有偏移,此时本应触发onClick却也被拦截掉了。所以为兼容大多数机器,需水平移动超过一定阈值时再拦截。所以在阈值范围内,gallery是不动的。

3.问题又来了,缓慢滑动第2项时,会发现"子项"有明显的突变(x坐标突变)。基本原因是看似滑动超过阈值后,gallery才开始正常移动,其实在手开始移动时(gallery尚未移动时),gallery也做了一些初始化,导致gallery真正移动时存在误差。

解决方法时,在阈值内滑动手指时,不断做这种初始化,这样在gallery真正开始运动时,初始化就没有误差了。


public class MyGallery extends Gallery {
	float mLastMotionX = 0;

	public MyGallery(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
	}

	public MyGallery(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
	}

	public MyGallery(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
	}

	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {

		final int action = ev.getAction();
		final float x = ev.getX();
		switch (action) {
		case MotionEvent.ACTION_MOVE:
			
			final int xDiff = (int) Math.abs(x - mLastMotionX);
			
			if (xDiff >50) {
				return true;
			}
			break;
		case MotionEvent.ACTION_DOWN:
			
			mLastMotionX = x;
			
			//防止滑动"第2项"时,发生突变
			onTouchEvent(ev);
			break;
		}
		return false;
	}
}


  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值