Android 事件传递
getAction()
和 getActionMasked()
getAction()
是以前的版本出来的
getActionMasked()
是为了多点触控, 现在用的话都选这个就好
shouldDelayChildPressedState()
自定义容器的时候, 如果不需要滚动, 那么需要重写 shouldDelayChildPressedState()
, 并且返回 false
, 这个方法如果要滚动的话, 会延迟 press
的状态
事件调用
正常情况下是
-
父容器的
dispatchTouchEvent()
-
-> 父容器的
boolean result = onInterceptTouchEvent()
-
-> 如果
result
为true
, 那么会调用 父容器自己的onTouchEvent()
-
如果
result
为false
, 会调用子View
的onTouchEvent
-
假设现在的需求是 RecyclerView
, 某个 holder
里面的一个子 View
设置了点击事件
-
当手指触摸到子
View
的时候父容器默认不拦截,-
如果手指直接抬起, 那么就响应子
View
的点击事件 -
如果手指移动, 移动距离达到了设定的阈值, 那么
RecyclerView 的 onInterceptTouchEvent()
会return true
, 把事件接管, 然后给子View
一个ACTION_CANCEL
事件
-
requestDisallowInterceptTouchEvent()
有的时候子 View
不想被父容器拦截事件, 就可以在 onTouchEvent()
的 DOWN
事件的时候调用 parent.requestDisallowInterceptTouchEvent(true)
然后 return true
这样后续的 MOVE
事件就会一直到自己的 onTouchEvent()
, 当达到一定条件自己不需要处理事件了调用 parent.requestDisallowInterceptTouchEvent(false)
这个时候如果父容器的 onInterceptTouchEvent()
返回了 true
, 那么就会接收到一个 CANCEL
事件, 然后后续的事件也不会再有了
事件传递伪代码
open class TestView {
open fun dispatchTouchEvent(ev: MotionEvent): Boolean {
return onTouchEvent(ev)
}
open fun onTouchEvent(ev: MotionEvent): Boolean {
return false
}
}
open class TestViewGroup : TestView() {
private var mChild: TestView? = null
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
return if (onInterceptTouchEvent(ev)) {
return onTouchEvent(ev)
} else {
mChild?.onTouchEvent(ev) ?: super.dispatchTouchEvent(ev)
}
}
open fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
return false
}
override fun onTouchEvent(ev: MotionEvent): Boolean {
return super.onTouchEvent(ev)
}
}
class MLayout : TestViewGroup() {
override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
return super.onInterceptTouchEvent(ev)
}
override fun onTouchEvent(ev: MotionEvent): Boolean {
return super.onTouchEvent(ev)
}
}
推荐阅读
-
Android自定义View 使用PathMeasure简单模仿系统ProgressBar(四)
-
Android studio中IDE窗口怎么显示或者隐藏?
-
Android studio怎么使用git获取最新内容然后合并?
-
Android Caused by: java.lang.ClassNotFoundException解决办法
-
Android开发之菜单(menu)用法实例分析
-
Android自定义ScrollView实现放大回弹效果实例代码
-
Android编程之ActionBar Tabs用法实例分析
-
Android自定义View圆形进度条控件(三)
-
Android studio中logcat提示信息设置?
-
Android获取本地相册图片和拍照获取图片的实现方法