- android开发艺术探索内容
- 主要就是三个方法
- dispatchTouchEvent
- onInterceptTouchEvent
- onTuochEvent
- -
dispatchTouchEvent(MotionEvent ev)
用来进行 事件的分发, 如果事件能够传递给当前的view,此方法一定会调用,返回结果手当前view的onTuochEvent 和下级view的dispatchTouchEvent方法的影响,表示消耗当前的事件
onInterceptTouchEvent(MotionEvent ev)
在上个方法的内部调用,用来判断是否需要 拦截某个事件,如果当前view拦截了某个事件,那么在同一个事件序列中,此方法不会再次调用, 返回结果表示是否拦截当前事件
- onTuochEvent(MotionEvent ev)
在dispatchTouchEvent内部调用,用来处理 点击事件,返回结果表示是否消耗当前事件, 如果不消耗,则在同一个事件序列中, 当前view无法再次接受到事件
- 如何用代码表示
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
boolean consume = false ;
if (onInterceptTouchEvent(ev)){
consume = onTouchEvent(ev);
}else {
consume = getChild().dispatchTouchEvent(ev);;
}
return consume ;
}
点击事件开始:会先传递到 根布局–>dispatchTouchEvent –>onInterceptTouchEvent返回true ,该事件会由根布局处理–>onTouchEvent调用!
如果 根布局的onInterceptTouchEvent返回false –>该事件由它的子布局的dispatchTouchEvent 处理 内部在执行上面的操作…
- 实际开发中
- viewpager 嵌套viewpager
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean consume = false ;
if (第一页向左滑 或者最后一页向右滑){
consume = true;
}else{
consume = false;
}
return consume;
}
这时候可以重写最外一层viewpager的onInterceptTouchEvent()方法,在里面根据逻辑:如果里面的viewpager滑动到第一页向左滑 或者最后一页向右滑,这时就 return true,表示要由最外层的viewpager处理滑动事件,当里面的viewpager不再上面的情况,就返回false,由里面的viewpager自己处理滑动事件!
-
复杂的嵌套中,如果当前控件想获取事件
这时就调用下面的方法,getParent()表示得到当前控件的父类及父类的的父类…requestDisallowInterceptTouchEvent() 传入true表示都不要拦截我的这个事件!这个事件由当前控件自己处理!!!
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
getParent().requestDisallowInterceptTouchEvent(true);
return super.dispatchTouchEvent(ev);
}