连续的输入事件可能会产生一定的手势操作。比如滑动手势和捏合手势。
在Chromium中,网页的输入事件是在Browser进程中捕捉的。Browser进程捕获输入事件之后,会进行手势操作检测。检测出来的手势操作将会发送给Render进程处理,由于它们须要应用在网页之上。与此同一时候。Browser进程也会将原始的输入事件发送给Render进程处理。本文接下来就分析Browser进程处理网页输入事件的过程。
老罗的新浪微博:,欢迎关注!
《Android系统源码情景分析》一书正在进击的程序猿网()中连载,点击进入。
接下来我们将以Chromium自带的Content Shell APK为例,说明Chromium的Browser进程捕获网页输入事件以及检测手势操作的过程,如图1所看到的:
图1 Browser进程处理网页输入事件的过程
从前面Chromium网页输入事件处理机制简要介绍和学习计划一文能够知道,Content Shell APK将网页渲染在一个SurfaceView控件上。
这个SurfaceView又是嵌入在一个ContentView控件里面的。
当用户在网页上触发了一个输入事件时,比如触发一个Touch事件时,这个Touch事件就会被系统分发给上述ContentView控件处理。表现为该ContentView控件的成员函数onTouchEvent被调用。
ContentView控件得到Touch事件之后,会将它传递到Chromium的C++层去处理。Java层的每个ContentView控件在C++层都相应一个ContentViewCore对象。C++层的ContentViewCore对象得到Touch事件之后。就会通过一个Gesture Dector和一个Scale Gesture Detector进行滑动(Scroll)和捏合(Pinch)手势检测。检测出来的滑动和捏合手势将会统一保存在一个Gestrue Packet中。这个Gestrue Packet接下来会被一个Input Router封装在一个类型为InputMsg_HandleInputEvent的IPC消息中,发送给Render进程处理。
注意。Touch事件经过手势检测之后。它本身也会被上述Input Router通过另外一个InputMsg_HandleInputEvent消息发送给Render进程处理。这意味着在这样的情况下,Render进程将收到两个InputMsg_HandleInputEvent消息。
接下来,我们就从ContentView类的成员函数onTouchEvent开始,分析Browser进程处理网页输入事件的过程,例如以下所看到的:
public class ContentView extends FrameLayout
implements ContentViewCore.InternalAccessDelegate, SmartClipProvider {
......
@Override
public boolean onTouchEvent(MotionEvent event) {
return mContentViewCore.onTouchEvent(event);
}
......
}
这个函数定义在文件external/chromium_org/content/public/android/java/src/org/chromium/content/browser/ContentView.java中。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-81055-1.html
不制造地区紧张武器怎么能好卖呢
虽然美国有台湾保护法
千千爱你