Android4.1 onTouchEvent分析 (选字模式等)
UI thread
++++ WebView.onTouchEvent
++++ Dispatcher.postPointerEvent ACTION_DOWN (4.1 WebView把事件交给Dispatcher处理)
++++ Dispatcher.updateStateTrackersLocked
++++ Dispatcher.checkForDoubleTapOnDownLocked (正二次计时并点击有效)
++++ if(mPostClickScheduled==true && (deltaX*deltaX+deltaY*deltaY)<mDoubleTapSlopSquared)
++++ mPostClickScheduled = false; 退出二次计时
++++ Dispatcher.mUiHandler.removeMessages MSG_CLICK 取消单击
++++ mPostClickScheduled = false; mIsDoubleTapCandidate = true; 等待双击
++++ Dispatcher mUiHandler.sendEmptyMessageDelayed MSG_LONG_PRESS (LONG_PRESS_TIMEOUT)
++++ Dispatcher.enqueueWebKitEvent EVENT_TYPE_HIT_TEST
++++ Dispatcher mWebKitHandler.sendEmptyMessage MSG_DISPATCH_WEBKIT_EVENTS
++++ Dispatcher mUiHandler.sendEmptyMessageDelayed MSG_SHOW_TAP_HIGHLIGHT (TAP_TIMEOUT)
++++ Dispatcher.enqueueUiEvent EVENT_TYPE_TOUCH
++++ Dispatcher mUiHandler.sendEmptyMessage MSG_DISPATCH_UI_EVENTS
++++ Dispatcher.dispatchUiEvents
++++ Dispatcher.dequeueUiEvent EVENT_TYPE_TOUCH 出队
++++ Dispatcher.dispatchUiEvent EVENT_TYPE_TOUCH 分给WebView
++++ WebView.dispatchUiEvent EVENT_TYPE_TOUCH
++++ WebView.onHandleUiEvent EVENT_TYPE_TOUCH
++++ WebView.onHandleUiTouchEvent
++++ WebView.handleTouchEventCommon ACTION_DOWN
++++ if(mSelectingText==true && 点中mSelectHandleLeft或mSelectHandleRight) 选字模式并点中游标
++++ mSelectionStarted = true; 开始选择 设置mSelectDraggingOffset、mSelectDraggingCursor
++++ WebView.startTouch
++++ Dispatcher mUiHandler.removeMessages MSG_DISPATCH_UI_EVENTS 队列为空
WebCore thread
++++ Dispatcher.mWebKitHandler.handleMessage MSG_DISPATCH_WEBKIT_EVENTS
++++ Dispatcher.dispatchWebKitEvents
++++ Dispatcher.dequeueWebKitEvent EVENT_TYPE_HIT_TEST
++++ Dispatcher.dispatchWebKitEvent EVENT_TYPE_HIT_TEST
++++ WebViewCore.dispatchWebKitEvent EVENT_TYPE_HIT_TEST
++++ WebViewCore.performHitTest
++++ WebViewCore.nativeHitTest
- - - - WebViewCore::HitTest
- - - - WebViewCore::hitTestAtPoint
- - - - Frame.EventHandler::hitTestResultAtPoint
- - - - RenderView.RenderLayer::hitTest
++++ WebViewCore WebView.sendMessage HIT_TEST_RESULT 将WebKitHitTest指针传给WebView
++++ Dispatcher.enqueueUiEvent EVENT_TYPE_HIT_TEST
++++ Dispatcher mUiHandler.sendEmptyMessage MSG_DISPATCH_UI_EVENTS
UI thread
++++ WebView.handleMessage HIT_TEST_RESULT
++++ WebView.setHitTestResult
++++ mInitialHitTestResult.setType和setExtra
UI thread
++++ Dispatcher.mUiHandler.handleMessage MSG_DISPATCH_UI_EVENTS
++++ Dispatcher.dispatchUiEvents
++++ Dispatcher.dequeueUiEvent EVENT_TYPE_HIT_TEST
++++ Dispatcher.dispatchUiEvent EVENT_TYPE_HIT_TEST
++++ WebView.dispatchUiEvent EVENT_TYPE_HIT_TEST
++++ WebView.onHandleUiEvent EVENT_TYPE_HIT_TEST
UI thread
++++ Dispatcher.mUiHandler.handleMessage MSG_SHOW_TAP_HIGHLIGHT
++++ Dispatcher.postShowTapHighlight
++++ WebView.showTapHighlight
++++ invalidate
UI thread
++++ Dispatcher.mUiHandler.handleMessage MSG_LONG_PRESS
++++ Dispatcher.postLongPress
++++ Dispatcher.enqueueUiEvent EVENT_TYPE_LONG_PRESS
++++ Dispatcher mUiHandler.sendEmptyMessage MSG_DISPATCH_UI_EVENTS
UI thread
++++ Dispatcher.mUiHandler.handleMessage MSG_DISPATCH_UI_EVENTS
++++ Dispatcher.dispatchUiEvents
++++ Dispatcher.dequeueUiEvent EVENT_TYPE_LONG_PRESS
++++ Dispatcher.dispatchUiEvent EVENT_TYPE_LONG_PRESS
++++ WebView.dispatchUiEvent EVENT_TYPE_LONG_PRESS
++++ WebView.onHandleUiEvent EVENT_TYPE_LONG_PRESS
++++ WebView.performLongClick
++++ WebView.selectText
++++ WebView WebViewCore.sendMessage SELECT_WORD_AT
WebCore thread
++++ WebViewCore.handleMessage SELECT_WORD_AT
++++ WebViewCore.nativeSelectWordAt
- - - - WebViewCore::SelectWordAt
- - - - WebViewCore::selectWordAt
- - - - RenderView.RenderLayer::hitTest 进行一次hitTest->Node(结点)->VisiblePosition->VisibleSelection
- - - - WebViewCore::selectWordAroundPosition
- - - - SelectionController::setSelection 保存选择结果VisibleSelection
- - - - return; 选择不变->返回
- - - - WebViewCore::updateTextSelection
- - - - WebViewCore::createSelectText 创建SelectText
- - - - WebViewCore JNI updateTextSelection
++++ WebViewCore.updateTextSelection 将SelectText指针传给WebView
++++ WebViewCore WebView.sendMessage UPDATE_TEXT_SELECTION_MSG_ID
UI thread
++++ WebView.onTouchEvent
++++ Dispatcher.postPointerEvent ACTION_MOVE
++++ Dispatcher.updateStateTrackersLocked
++++ Dispatcher.enqueueUiEvent EVENT_TYPE_TOUCH
++++ Dispatcher mUiHandler.sendEmptyMessage MSG_DISPATCH_UI_EVENTS
++++ Dispatcher.dispatchUiEvents
++++ Dispatcher.dequeueUiEvent EVENT_TYPE_TOUCH
++++ Dispatcher.dispatchUiEvent EVENT_TYPE_TOUCH
++++ WebView.dispatchUiEvent EVENT_TYPE_TOUCH
++++ WebView.onHandleUiEvent EVENT_TYPE_TOUCH
++++ WebView.onHandleUiTouchEvent
++++ WebView.handleTouchEventCommon ACTION_MOVE
++++ if(mSelectingText==true && mSelectionStarted==true) 选字模式并开始选择
++++ WebView.updateWebkitSelection
++++ WebView WebViewCore.sendMessage SELECT_TEXT
++++ invalidate
WebCore thread
++++ WebViewCore.handleMessage SELECT_TEXT
++++ WebViewCore.nativeSelectText
- - - - WebViewCore::SelectText
- - - - WebViewCore::selectText
- - - - RenderView.RenderLayer::hitTest start hitTest->Node(结点)->VisiblePosition
- - - - RenderView.RenderLayer::hitTest end hitTest->Node(结点)->VisiblePosition->VisibleSelection
- - - - SelectionController::setSelection 保存选择结果VisibleSelection
- - - - return; 选择不变->返回
- - - - WebViewCore::updateTextSelection 选择改变->更新
- - - - WebViewCore::createSelectText 创建SelectText
- - - - WebViewCore JNI updateTextSelection
++++ WebViewCore.updateTextSelection 将SelectText指针传给WebView
++++ WebViewCore WebView.sendMessage UPDATE_TEXT_SELECTION_MSG_ID
UI thread
++++ WebView.handleMessage UPDATE_TEXT_SELECTION_MSG_ID
++++ WebView.updateTextSelectionFromMessage
++++ WebView.nativeSetTextSelection 保存SelectText指针在WebView中
- - - - WebView::nativeSetTextSelection
- - - - WebView::setTextSelection
- - - - WebView::setDrawExtra
++++ WebView.setupWebkitSelect 进入选字模式
++++ WebView.startSelectingText mSelectingText=true; mShowTextSelectionExtra=true;
++++ mTouchMode=TOUCH_DRAG_MODE;
++++ invalidate
UI thread
++++ WebView.onTouchEvent
++++ Dispatcher.postPointerEvent ACTION_UP
++++ Dispatcher.updateStateTrackersLocked
++++ Dispatcher.mUiHandler.removeMessages MSG_LONG_PRESS 取消长按
++++ if(downDuration<LONG_PRESS_TIMEOUT)长按前
++++ if(mIsDoubleTapCandidate==true)正等待双击
++++ Dispatcher.enqueueUiEvent EVENT_TYPE_DOUBLE_TAP
++++ Dispatcher mUiHandler.sendEmptyMessage MSG_DISPATCH_UI_EVENTS
++++ else
++++ mPostClickScheduled=true; 开始二次计时,发送短按
++++ Dispatcher mUiHandler.sendEmptyMessageDelayed MSG_CLICK (DOUBLE_TAP_TIMEOUT)
++++ else
++++ WebView.showTapHighlight
++++ Dispatcher.enqueueUiEvent EVENT_TYPE_TOUCH
++++ Dispatcher mUiHandler.sendEmptyMessage MSG_DISPATCH_UI_EVENTS
++++ Dispatcher.dispatchUiEvents
++++ Dispatcher.dequeueUiEvent EVENT_TYPE_DOUBLE_TAP 【若有双击事件】
++++ Dispatcher.dispatchUiEvent EVENT_TYPE_DOUBLE_TAP
++++ WebView.dispatchUiEvent EVENT_TYPE_DOUBLE_TAP
++++ WebView.onHandleUiEvent EVENT_TYPE_DOUBLE_TAP
++++ ZoomManager.handleDoubleTap
++++ Dispatcher.dequeueUiEvent EVENT_TYPE_TOUCH
++++ Dispatcher.dispatchUiEvent EVENT_TYPE_TOUCH
++++ WebView.dispatchUiEvent EVENT_TYPE_TOUCH
++++ WebView.onHandleUiEvent EVENT_TYPE_TOUCH
++++ WebView.onHandleUiTouchEvent
++++ WebView.handleTouchEventCommon ACTION_UP
++++ 【1】TOUCH_INIT_MODE或TOUCH_SHORTPRESS_START_MODE或TOUCH_SHORTPRESS_MODE 短按
++++ if(mSelectingText==true && mSelectionStarted==false) 选字模式但没有开始选择(即没点中游标)
++++ WebView.selectionDone 退出选字模式
++++ WebView.endSelectingText mSelectingText=false; mShowTextSelectionExtra=false;
++++ invalidate
++++ 【2】
++++
++++ WebView.stopTouch
++++ Dispatcher mUiHandler.removeMessages MSG_DISPATCH_UI_EVENTS
UI thread
++++ Dispatcher.mUiHandler.handleMessage MSG_CLICK 超过二次计时->单击
++++ Dispatcher.postClick
++++ mPostClickScheduled = false; 取消二次计时
++++ WebView.showTapHighlight
++++ Dispatcher.enqueueWebKitEvent EVENT_TYPE_CLICK
++++ Dispatcher mWebKitHandler.sendEmptyMessage MSG_DISPATCH_WEBKIT_EVENTS
WebCore thread
++++ Dispatcher.mWebKitHandler.handleMessage MSG_DISPATCH_WEBKIT_EVENTS
++++ Dispatcher.dispatchWebKitEvents
++++ Dispatcher.dequeueWebKitEvent EVENT_TYPE_CLICK
++++ Dispatcher.dispatchWebKitEvent EVENT_TYPE_CLICK
++++ WebViewCore.dispatchWebKitEvent EVENT_TYPE_CLICK
++++ WebViewCore.nativeMouseClick
- - - - WebViewCore::MouseClick
- - - - WebViewCore::performMouseClick
- - - - EventHandler::handleMousePressEvent
- - - -
- - - - EventHandler::handleMouseReleaseEvent
- - - - EventHandler::prepareMouseEvent
- - - - Document::prepareMouseEvent
- - - - RenderView.RenderLayer::hitTest
- - - - EventHandler::dispatchMouseEvent mouseup
- - - - EventDispatcher::dispatchEvent mouseup
- - - - EventHandler::dispatchMouseEvent click
- - - - EventDispatcher::dispatchEvent click
- - - - (Node*->defaultEventHandler click)
- - - - HTMLAnchorElement::defaultEventHandler
- - - - WebCore::handleLinkClick
- - - - FrameLoader::urlSelected 发送请求
++++ Dispatcher.enqueueUiEvent EVENT_TYPE_CLICK
++++ Dispatcher mUiHandler.sendEmptyMessage MSG_DISPATCH_UI_EVENTS
UI thread
++++ Dispatcher.mUiHandler.handleMessage MSG_DISPATCH_UI_EVENTS
++++ Dispatcher.dispatchUiEvents
++++ Dispatcher.dequeueUiEvent EVENT_TYPE_CLICK
++++ Dispatcher.dispatchUiEvent EVENT_TYPE_CLICK
++++ WebView.dispatchUiEvent EVENT_TYPE_CLICK
++++ WebView.onHandleUiEvent EVENT_TYPE_CLICK
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
++++
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
++++
++++
UI thread
Android4.1 onTouchEvent分析 (选字模式等)相关推荐
- lintcode-828. 字模式
题目描述: 828.字模式 给定一个模式和一个字符串str,查找str是否遵循相同的模式. 这里遵循的意思是一个完整的匹配,在一个字母的模式和一个非空的单词str之间有一个双向连接的模式对应. 样例 ...
- win10输入法看不见选字框_win10系统运行传奇打字时看不到选框如何处理
一位用户反馈自己将电脑系统升级到win10正式版后,刚开始还觉得新系统界面比win7精致细腻,可是在运行传奇游戏时就遇到了打字时看不到选框的情况,这是怎么回事呢?其实,该问题是由于输入法不兼容引起的. ...
- vue使用vue2-verify实现前端验证码(滑动,拼图,数字,选字验证)
先附上插件github地址 vue2-verify 先说一下弊端,使用拼图模式时,只能使用外链图片,使用本地图片时怎么写都不对,加载不到资源,如果有人知道怎么写可以留言给我,其他模式还是很好用的,在移 ...
- win10输入法看不见选字框_win10系统运行传奇打字时看不到选框如何处理?
一位用户反馈自己将电脑系统升级到win10正式版后,刚开始还觉得新系统界面比win7精致细腻,可是在运行传奇游戏时就遇到了打字时看不到选框的情况,这是怎么回事呢?其实,该问题是由于输入法不兼容引起的. ...
- Android4.4 framework分析——ActivityManagerService的启动和对Activity的管理
本文主要介绍android4.4中ActivityManagerService的启动和ActivityManagerService对Activity堆栈的管理. 一.ActivityManagerSe ...
- 计算机英语学情分析怎么写,2016年信息技术教学计划及学情分析(600字)
JE范文为您整理.编辑<2016年信息技术教学计划及学情分析(600字)>一文,为了您更好完成一篇精彩的范文,JE范文还为你准备与<2016年信息技术教学计划及学情分析(600字)& ...
- AbstractQueuedSynchronizer 原理分析 - 独占/共享模式
1.简介 AbstractQueuedSynchronizer (抽象队列同步器,以下简称 AQS)出现在 JDK 1.5 中,由大师 Doug Lea 所创作.AQS 是很多同步器的基础框架,比如 ...
- Win11输入法的选字框不见了怎么办?
有很多升级到Win11系统的用户反映在打字的时候发现输入法竟然不显示选字框了,不知道要如何进行解决,其实解决的方法非常的简单,快来看看小编为大家带来的Win11输入法的选字框不见了的解决方法吧,希望可 ...
- 选字验证码破解思路:CTPN - 自然场景文本检测
前言 最近准备极验3代,选字验证码的破解.之前用CNN实现端到端的字符型验证码破解已满足不了需求了,我以为破解选字验证码关键步骤有三:1.图片文本的识别:2.字符坐标的识别:3.字序的识别.设计的技术 ...
最新文章
- 摄像机的几个重要的技术指标
- 微软开源 Quantum Katas,领先的量子编程解决方案
- 模生物嗅觉的神经算法,能让电脑芯片识别气味
- 从sqlserver中数据写入mysql_[SQL Server]SQL Server数据库中如何返回INSERT INTO语句插入/写入数据后的记录值(比如ID等)?...
- Python-OpenCV--直线提取
- 理解 Linux 中 `ls` 的输出
- OpenCV学习笔记(三):图像对比度、亮度调整源码
- Java程序员高效开发必备工具,其中有你的最爱吗?
- Silverlight中需要用到模板选择器(DataTemplateSelector)的替代方案
- 向量与向量空间(vector space)
- 多智能体强化学习之MAPPO理论解读
- 一:springCloud服务发现者,服务消费者(方志朋《史上最简单的 SpringCloud 教程》专栏读后感)
- 产品温度冲击检测 VS 实际使用寿命换算详解
- MySQL 数据库删除操作中的 delete、drop、 truncate 区别在哪?
- timesat数据如何读取_判二手车调表车另类方法。如何利用OBD读取可靠数据(技术类)...
- Command ‘ifconfig‘ not found/ubuntu无法联网(有线);Ubuntu联网只有lo 没有eth0情况;Ubuntu无线联网,有WIFI未发现WIFI适配器(有网卡)
- 实现正负值及多条Y轴 Echarts柱状图
- 要关闭python解释器可使用函数或者快捷键_超星尔雅中华传统文化之戏曲瑰宝第七章节测验网课答案选修课慕课答案...
- Code jock 8.7 源代码编译
- 胖哈勃 web--NewSql Mysql 8 注入