记录项目中的一个实际场景,需要用到一个组合控件
用Gallery实现,Item的布局中有一个RelativeLayout的节点,用来动态添加其他某控件
言归正传,就是该Layout和Gallery的滑动冲突,如果不做任何处理,那么layout的点击事件生效,而Gallery的滑动失效
这种问题第一反应就是,事件分发机制导致,所以系统的去看了下onInterceptTouchEvent()、onTouchEvent()的返回值对事件传递造成什么样的影响。
这里引用net上描述的相对清楚一点的一段
基本的规则是:
1.
2.
3.
4.
5.
有点尴尬的是,在网上看了一大通,算是一知半解,但是对问题的解决还是没有思路。
当时的第一种解决方式就是
此时的办法是重写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:第一次写博客,写的很烂,得加油了!!!