Android4.1 onTouchEvent分析 (选字模式等)
生活随笔
收集整理的這篇文章主要介紹了
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
++++ 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分析 (选字模式等)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git打patch
- 下一篇: CSS3 2D和3D转换 Transfo