触摸消息的整体派发流程
来源:互联网 发布:js修改div属性 编辑:程序博客网 时间:2024/05/21 12:45
先简单说明下在客户端中,消息的总体派发机制:
在ViewRootImpl.java的handleMessage()是处理所有消息的地方,其中MSG_PROCESS_INPUT_EVENTS对应于按键消息,触摸消息,滚轮消息和摇杆消息。接收到这个消息后,调用doProcessInputEvents(),这个函数再调用deliverInputEvent()分发具体消息,其中触摸消息对应于deliverPointerEvent()。在这个函数中会先对消息进行一些处理然后再派发给根视图mView.dispatchPointerEvent(event)。这个mView是PhoneWindow中的DecorView。
PhoneWindow.DecorView public boolean dispatchTouchEvent(MotionEvent ev) { final Callback cb = getCallback(); return cb != null && !isDestroyed() && mFeatureId < 0 ? cb.dispatchTouchEvent(ev) : super.dispatchTouchEvent(ev); }
这里首先判断是否存在Callback对象,即Activity对象。如果有:cb.dispatchTouchEvent()
Activity public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { onUserInteraction();//这里什么也没做交给用户有需要的时候在处理ACTION_DOWN事件之前做点什么 } if (getWindow().superDispatchTouchEvent(ev)) { return true; } return onTouchEvent(ev);//这里面什么也没做,交给用户处理。 }如果有window对象,接着调用Window.java中的superDispatchTouchEvent,而实现Window中的这个函数的类是PhoneWindow
PhoneWindow @Override public boolean superDispatchTouchEvent(MotionEvent event) { return mDecor.superDispatchTouchEvent(event); }
因此又回到了DecorView中调用superDispatchTouchEvent而该函数调用了ViewGroup中的dispatchTouchEvent()函数。此处如果没有消化掉这个消息,则调用onTouchEvent()处理事件。
上面如果不存在Callback对象,则直接调用了ViewGroup中的dispatchTouchEvent()函数。
- 触摸消息的整体派发流程
- Android 触摸消息派发之ViewGroup的派发过程
- android触摸消息的派发过程
- 按键消息派发流程
- ViewGroup中的触摸消息派发dispatchTouchEvent
- View工作原理【触摸消息派发】
- Android 自定义View 之 触摸消息派发
- Handler的消息派发
- 控件树的触摸事件派发小结
- View工作原理之触摸消息派发过程
- protobuf消息的自动派发
- 关于windows消息的派发
- android 事件派发的流程
- 消息相关的函数DispatchMessage - 派发消息
- iOS消息推送整体流程
- 关于Android事件派发流程的理解
- Struts2的整体流程
- Spark 的整体流程
- 电子商务O2O不是零售业的“补充”,它将毁灭零售业!
- Format函数
- 使用$.getJSON实现跨域ajax请求示例代码
- 黑马程序员数据绑定
- JBoss jmx-console和web-console的安全设置
- 触摸消息的整体派发流程
- 使用PyRTF的生成RTF文件
- C#中如何将DataTable中的数据导出到Excel
- 如何学好C语言
- 整型与无符号整型 运算时值的转换
- jfeinstein10的SlidingMenu环境的部署
- Bootstrap Popover 隐藏的Javasript方法
- LVS测试
- JSP表格模板升级(1)-- 用Java反射动态指定方法和参数