Gallery滑动与Item中Layout点击冲突解决

记录项目中的一个实际场景,需要用到一个组合控件

用Gallery实现,Item的布局中有一个RelativeLayout的节点,用来动态添加其他某控件

言归正传,就是该Layout和Gallery的滑动冲突,如果不做任何处理,那么layout的点击事件生效,而Gallery的滑动失效

这种问题第一反应就是,事件分发机制导致,所以系统的去看了下onInterceptTouchEvent()、onTouchEvent()的返回值对事件传递造成什么样的影响。


这里引用net上描述的相对清楚一点的一段

基本的规则是:

1.       down事件首先会传递到onInterceptTouchEvent()方法
2.       如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return false,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理。
3.       如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return true,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。
4.       如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理。
5.       如果最终需要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。

有点尴尬的是,在网上看了一大通,算是一知半解,但是对问题的解决还是没有思路。

当时的第一种解决方式就是

此时的办法是重写Gallery的onInterceptTouchEvent

@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {

		if (ev.getAction() == MotionEvent.ACTION_MOVE) {
			return true;
		} else {
			return false;
		}
	}

但是这个点击效果生效特别困难,要用指尖快速点击和抬起,就是所谓的不灵敏,实际效果并不好

当时就接着想要区分下MotionEvent滑动和点击,只有点击的时候就返回false,对于Gallery来说,让子控件去消费此事件

但是常用的MotionEvent只有 Move,Up,Down三种 ,并没有Click,所以需要自己去写代码实现

    float x = 0 ;
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        int action = ev.getAction();
        switch (action){
            case MotionEvent.ACTION_DOWN:
                x = ev.getX();
                super.onTouchEvent(ev);
                break;
            case MotionEvent.ACTION_UP:
                break;
            case MotionEvent.ACTION_CANCEL:
                break;
            case MotionEvent.ACTION_MOVE:
                float daltX = Math.abs(x - ev.getX());
                if(daltX < 1){
                    return false;
                }else {
                    return true;
                }
        }
        return false;
    }

上面daltX,如果小于1,表示是一次点击,至于1的单位是不是像素我也不知道╮(╯▽╰)╭

如果大于1,代表着滑动吧


花了几个小时就解决了这个问题,所涉及的技术层面也相对浅显吧,很多地方也是知道点皮毛,写下来的原因就是让自己碰到过的问题能够帮到有需要的人吧。。。

PS:第一次写博客,写的很烂,得加油了!!!


  
  
  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值