本编意在指引入门,非技术性分析文章,以生活中的实例帮你更好的理解 touch 事件的传递。bash
回忆刚接触 touch 事件传递时,文章大可能是源码分析,对于有基础的人来讲,上手很容易,但对于我这种新手来讲,心中有万马奔腾。。。源码分析
炎炎夏日,你和你爸爸都很热,如今在你爸爸手里有一根雪糕,那么这根雪糕怎么分、谁吃就能够演变成 Android touch 的事件分发。ui
咱们先说说结果,雪糕无非就三种,你吃、你爸爸吃、都不吃。this
经过这个场景,你们将方法带入,是否是就很容易理解了呢?spa
由于你已是最后一个了,不用问谁了,直接决定吃不吃就能够了。.net
其实你爸爸可否吃到雪糕的决定权仍是在你的手里,code
伪代码:对象
if( 孩子是否想吃 || !爸爸是否留下){
给孩子吃
}else{
爸爸吃
}
复制代码
默认孩子不想吃(false),爸爸不留下(false),blog
if( false || !false){
给孩子吃
}else{
爸爸吃
}
复制代码
正常的状况下都会给孩子吃, 当爸爸留下(true)时,事件
if( false || !true){
给孩子吃
}else{
爸爸吃
}
复制代码
就走到了 else 中,也就是爸爸吃。
在 Android 中咱们能够经过 requestDisallowInterceptTouchEvent(孩子是否想吃)
这个方法改变孩子是否想吃的值,当孩子调用requestDisallowInterceptTouchEvent
方法返回 true 时,不管爸爸是否想吃,都会走到孩子想吃中,也就是最终结果是你吃。
if( true || !爸爸是否留下){
给孩子吃
}else{
爸爸吃
}
复制代码
// 标记子 view 请求是否不拦截(孩子是否想吃,默认不想)
boolean disallowIntercept = false;
// 调用 dispatchTouchEvent(爸爸拿来了一根雪糕)
public boolean dispatchTouchEvent(MotionEvent ev) {
// 标记事件是否被消费掉(雪糕是否被吃)
boolean consume = false;
// 判断是否拦截事件(雪糕给不给孩子)
if ( disallowIntercept || !onInterceptTouchEvent(ev)) {
// 若拦截,则将该事件交给当前View进行处理
// 即调用onTouchEvent 方法去处理点击事件(爸爸吃雪糕)
consume = onTouchEvent (ev) ;
} else {
// 若不拦截,则将该事件传递到下层,即下层元素的dispatchTouchEvent就会被调用,直到点击事件被最终处理为止(孩子吃或者不吃)
consume = child.dispatchTouchEvent (ev) ;
}
// 最终返回通知 该事件是否被消费(吃或不吃)
return consume;
}
// 子 view 能够经过调用此方法 改变 disallowIntercept 的值
public void requestDisallowInterceptTouchEvent(boolean disallowIntercept){
this.disallowIntercept = disallowIntercept;
}
复制代码
这里有几篇很是好的讲解: