Chromium网页输入事件捕捉和手势检测过程分析文档格式.docx
《Chromium网页输入事件捕捉和手势检测过程分析文档格式.docx》由会员分享,可在线阅读,更多相关《Chromium网页输入事件捕捉和手势检测过程分析文档格式.docx(39页珍藏版)》请在冰豆网上搜索。
Java层的每一个ContentView控件在C++层都对应一个ContentViewCore对象。
C++层的ContentViewCore对象得到Touch事件之后,就会通过一个GestureDector和一个ScaleGestureDetector进行滑动(Scroll)和捏合(Pinch)手势检测。
检测出来的滑动和捏合手势将会统一保存在一个GestruePacket中。
这个GestruePacket接下来会被一个InputRouter封装在一个类型为InputMsg_HandleInputEvent的IPC消息中,发送给Render进程处理。
注意,Touch事件经过手势检测之后,它本身也会被上述InputRouter通过另外一个InputMsg_HandleInputEvent消息发送给Render进程处理。
这意味着在这种情况下,Render进程将收到两个InputMsg_HandleInputEvent消息。
接下来,我们就从ContentView类的成员函数onTouchEvent开始,分析Browser进程处理网页输入事件的过程,如下所示:
[java]viewplaincopy
publicclassContentViewextendsFrameLayout
implementsContentViewCore.InternalAccessDelegate,SmartClipProvider{
......
@Override
publicbooleanonTouchEvent(MotionEventevent){
returnmContentViewCore.onTouchEvent(event);
}
}
这个函数定义在文件external/chromium_org/content/public/Android/java/src/org/chromium/content/browser/ContentView.java中。
参数event指向的MotionEvent对象描述的就是当前发生的Touch事件。
ContentView类的成员变量mContentViewCore指向的是一个ContentViewCore对象,ContentView类的成员函数onTouchEvent调用这个ContentViewCore对象的成员函数onTouchEvent处理参数event所描述的Touch事件。
ContentViewCore类的成员函数onTouchEvent的实现如下所示:
publicclassContentViewCore
implementsNavigationClient,AccessibilityStateChangeListener,ScreenOrientationObserver{
TraceEvent.begin("
onTouchEvent"
);
try{
finalintpointerCount=event.getPointerCount();
finalbooleanconsumed=nativeOnTouchEvent(mNativeContentViewCore,event,
event.getEventTime(),eventAction,
pointerCount,event.getHistorySize(),event.getActionIndex(),
event.getX(),event.getY(),
pointerCount>
1?
event.getX
(1):
0,
event.getY
(1):
event.getPointerId(0),pointerCount>
event.getPointerId
(1):
-1,
event.getTouchMajor(),pointerCount>
event.getTouchMajor
(1):
event.getRawX(),event.getRawY(),
event.getToolType(0),
event.getToolType
(1):
MotionEvent.TOOL_TYPE_UNKNOWN,
event.getButtonState());
returnconsumed;
}finally{
TraceEvent.end("
这个函数定义在文件external/chromium_org/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java中。
ContentViewCore类的成员函数onTouchEvent主要是调用另外一个成员函数nativeOnTouchEvent处理参数event描述的Touch事件。
ContentViewCore类的成员函数nativeOnTouchEvent是一个JNI函数,它由C++层的函数Java_com_android_org_chromium_content_browser_ContentViewCore_nativeOnTouchEvent实现,如下所示:
[cpp]viewplaincopy
__attribute__((visibility("
default"
)))
jboolean
Java_com_android_org_chromium_content_browser_ContentViewCore_nativeOnTouchEvent(JNIEnv*
env,
jobjectjcaller,
jlongnativeContentViewCoreImpl,
jobjectevent,
jlongtimeMs,
jintaction,
jintpointerCount,
jinthistorySize,
jintactionIndex,
jfloatx0,
jfloaty0,
jfloatx1,
jfloaty1,
jintpointerId0,
jintpointerId1,
jfloattouchMajor0,
jfloattouchMajor1,
jfloatrawX,
jfloatrawY,
jintandroidToolType0,
jintandroidToolType1,
jintandroidButtonState){
ContentViewCoreImpl*native=
reinterpret_cast<
ContentViewCoreImpl*>
(nativeContentViewCoreImpl);
CHECK_NATIVE_PTR(env,jcaller,native,"
OnTouchEvent"
false);
returnnative->
OnTouchEvent(env,jcaller,event,timeMs,action,pointerCount,
historySize,actionIndex,x0,y0,x1,y1,pointerId0,pointerId1,
touchMajor0,touchMajor1,rawX,rawY,androidToolType0,androidToolType1,
androidButtonState);
这个函数定义在文件out/target/product/generic/obj/GYP/shared_intermediates/content/jni/ContentViewCore_jni.h中。
参数nativeContentViewCoreImpl描述的是C++层的一个ContentViewCoreImpl对象,函数Java_com_android_org_chromium_content_browser_ContentViewCore_nativeOnTouchEvent调用这个ContentViewCoreImpl对象的成员函数OnTouchEvent处理其它参数所描述的Touch事件。
ContentViewCoreImpl类的成员函数OnTouchEvent的实现如下所示:
jbooleanContentViewCoreImpl:
:
OnTouchEvent(JNIEnv*env,
jobjectobj,
jobjectmotion_event,
jlongtime_ms,
jintandroid_action,
jintpointer_count,
jinthistory_size,
jintaction_index,
jfloatpos_x_0,
jfloatpos_y_0,
jfloatpos_x_1,
jfloatpos_y_1,
jintpointer_id_0,
jintpointer_id_1,
jfloattouch_major_0,
jfloattouch_major_1,
jfloatraw_pos_x,
jfloatraw_pos_y,
jintandroid_tool_type_0,
jintandroid_tool_type_