博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
下拉放大头部图片并弹回
阅读量:6239 次
发布时间:2019-06-22

本文共 1347 字,大约阅读时间需要 4 分钟。

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->View

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

当一个点击事件发生时,事件最先传到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()

转载于:https://juejin.im/post/5cbf4dcc6fb9a0324c20bd85

你可能感兴趣的文章
RabbitMQ学习总结(7)——Spring整合RabbitMQ实例
查看>>
Notepad++ 快捷键大全
查看>>
Oracle统计求和
查看>>
在Android搭建简单的服务器
查看>>
智能合约编程/Dapp漏洞 --Unexpected Ether
查看>>
perl写的tcp连接数
查看>>
Windows 7自带截图工具技巧两则
查看>>
如何规划构建一套大型的Citrix桌面虚拟化架构 - 后记
查看>>
zencart lazyload插件
查看>>
delete和delete[] 的深度思考
查看>>
linux ifconfig命令
查看>>
截杀“WannaCrypt”,终结“永恒之蓝”!
查看>>
Oracle内部视图:x$ktfbue
查看>>
【日常管理】Asm Diskgroup增加磁盘add disk
查看>>
Exadata下新建DiskGroup
查看>>
了解ocssd.bin如何控制RAC节点重启
查看>>
CentOS学习笔记 - 8. docker 编译基于gofabric8的java应用镜像
查看>>
关于ps cs6的滤镜 (抽出)
查看>>
项目版本管理(TFS)删除项目
查看>>
modprobe
查看>>