下拉放大头部图片并弹回

Android事件的分发机制(Touch)

  1. 事件类型(4种):
事件类型 具体动做
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。函数

  1. 事件的分发即事件的传递

Activity->ViewGroup->Viewspa

dispathTouchEvent()->onInterceptTouchEvent()->onTouchEvent()code

当一个点击事件发生时,事件最早传到ActivitydispatchTouchEvent()进行事件分发事件

建立一个新的layout并重写onInterceptTouchEvent() 和onTouchEvent()

  1. onInterceptTouchEvent()中拦截DOWN事件,若是检测到向下滑动View,return true(将事件分发给后面的OnTouchEvent())。
  2. onTouchEvent()中的ACTION_DOWN动做中得到向下滑动的实时距离,并用function将header图片进行放大
  3. onTouchEvent()中的ACTION_UP动做中使用恢复header图片的尺寸的function将下拉的图片弹回
  4. 在自定义的layout中,须要使用函数将header从Activity传入Layout,在Activity中使用setHeader()函数将header的id传过来。

触摸方向冲突问题

  1. 当外部的Layout截获了Touch事件后,内部的View将再也不可以获取处处理ViewTouch事件的权力,此时会出现触摸方向冲突问题:当手指按下屏幕并向下滑动,正常状况下应该是下拉回弹的动做,但此时若是没有松开手指而是往回拖动View并超过了原来View的初始位置时,View再也不自动滚动,失去手指的控制能力。这是由于当触发了下拉回弹的动做条件时,该动做会被LayoutonTouchEvent()截获,而View的滚动是属于View自己的动做,不受Layout支配,这时要想办法将Layout的控制权交出给View图片

    dispatchTouchEvent()使用一个Boolean来判断是不是第一次上拉动做,而后再在onTouchEvent()中的须要交出控制权的条件内部,建立一个新的TouchEvent并付给该View,使用dispatchTouchEvent(event)来付与View控制权,用return false将控制权从onTouchEvent()还回dispatchTouchEvent()。这样在检测到不该该被截获的动做时,动做权被交还给dispatchTouchEvent()it

相关文章
相关标签/搜索