事件类型 | 具体动做 |
---|---|
MotionEvent.ACTION_DOWN | 按下View(全部事件开始) |
MotionEvent.ACTION_UP | 抬起View |
MotionEvent.ACTION_MOVE | 滑动View |
MotionEvent.ACTION_CANCEL | 结束事件 |
MotionEvent.ACTION_MASK | 处理多点触控(ACTION_POINTER_UP,ACTION_POINTER_DOWN) |
通常都是由事件DOWN开始到事件UP结束,中间有无数个MOVE。函数
Activity
->ViewGroup
->View
spa
dispathTouchEvent()
->onInterceptTouchEvent()
->onTouchEvent()
code
当一个点击事件发生时,事件最早传到Activity
的dispatchTouchEvent()
进行事件分发事件
onInterceptTouchEvent()
中拦截DOWN事件,若是检测到向下滑动View,return true
(将事件分发给后面的OnTouchEvent()
)。onTouchEvent()
中的ACTION_DOWN
动做中得到向下滑动的实时距离,并用function将header图片进行放大onTouchEvent()
中的ACTION_UP
动做中使用恢复header图片的尺寸的function将下拉的图片弹回Activity
传入Layout
,在Activity中使用setHeader()函数将header的id传过来。当外部的Layout
截获了Touch
事件后,内部的View
将再也不可以获取处处理View
的Touch
事件的权力,此时会出现触摸方向冲突问题:当手指按下屏幕并向下滑动,正常状况下应该是下拉回弹的动做,但此时若是没有松开手指而是往回拖动View
并超过了原来View
的初始位置时,View
再也不自动滚动,失去手指的控制能力。这是由于当触发了下拉回弹的动做条件时,该动做会被Layout
的onTouchEvent()
截获,而View
的滚动是属于View
自己的动做,不受Layout
支配,这时要想办法将Layout
的控制权交出给View
。图片
在dispatchTouchEvent()
使用一个Boolean
来判断是不是第一次上拉动做,而后再在onTouchEvent()
中的须要交出控制权的条件内部,建立一个新的TouchEvent
并付给该View
,使用dispatchTouchEvent(event)
来付与View
控制权,用return false
将控制权从onTouchEvent()
还回dispatchTouchEvent()
。这样在检测到不该该被截获的动做时,动做权被交还给dispatchTouchEvent()
。it