在项目中遇到了ScrollView 与内部的Gallery Touch事件的问题,学习了网上大侠们的研究成果,以及Android官网的文档,根据个人理解在此做个学习记录,也希望对大家有所帮助。
一、Android Touch事件的传递机制
从外层的View依次向内层的子View分发传递,直至某个子View处理了Touch事件(即该子View的onTouchEvent方法做出相应处理,并返回true),否则到最内层的子View之后,再冒泡向上返回当前View对Touche事件处理的结果(即View的onTouchEvent返回的布尔值)。
二、Android Touch事件三个方法
1)public boolean dispatchTouchEvent(MotionEvent ev) 向下层的目标View传递(分发)触摸事件,如果当前View为目标View则传递给当前View
返回值:true 表示当前的View分发处理Touch事件,首先接收到了down,以及后续的up等,此时可以将完整的down、up传递给子View或者当前View。
false 当前View没有分发处理Touch事件,其子View也不能处理Touch事件。
2)public boolean onInterceptTouchEvent(MotionEvent ev) 截获所有的Touch事件
返回值:true 该事件被当前View截获处理,此方法将不再接收到后续的Touch事件,所有的后续事件将在当前View的onTouchEvent中处理,事件的目标View仍能接收到相同的Touch事件,但该事件的Action为ACTION_CANCEL。
false 所有的Touch将会首先传递到此方法,然后传递到该Touch事件的目标View的onTouchEvent中。
3)public boolean onTouchEvent(MotionEvent event) 处理Touch事件。
返回值:true 表示Touch事件被当前View处理了,父View收到当前View返回的true时认为该Touchu事件已经被处理。
false 表示Touchu事件没有被处理,将向上传递给父View进行处理。
三、Android Touch事件流程
在Android2.2下,无论dispatchTouchEvent返回true和false都会调用onInterceptTouchEvent方法,这和网上讨论的说法有所不同,没有验证是否是版本问题。同时,dispatchTouchEvent返回false时View只能接收到down事件,后续事件不能再接收到,无法调用onTouchEvent。