Android系统中,目前没有一个接口可以让应用随时获取Touch事件,而这个功能恰恰是全屏手写中很重要的一个部分。 手写输入的实现主要分为3个部分:
1、笔画的获取
2、笔画的绘制
3、笔画的识别
在以往broncho项目中,根据平时的交流和对WM的粗略接触,以往全屏手写的笔画获取都是在WM里处理来实现笔画数据获取的。这一次在android系统上实现全屏手写,稍微改变了一下思路:
1、WM提供一个touch事件发送接口,让应用可以注册一个touch事件监听。事件监听函数返回true,WM不再处理这个事件,返回false,WM继续分发这个事件。
2、WM提供一个touch事件发送接口,让应用可以模拟发送touch事件。
3、修改WM事件分发函数,在分发touch事件到应用前,先调用事件监听函数。发送touch事件的接口可以直接调用WM的接口。
4、WM就做了这些修改,笔画的获取处理放到了全屏手写输入法中。
根据今天(2009年6月26日)在硬件上的调试结果,这个思路还是灵活的,对笔画事件获取的处理不再需要修改WM,直接修改全屏手写应用,然后安装即可。
目前的测试结果是笔画的获取还有不足,如多余的MOVE事件没有过滤(多余的MOVE事件就是没有收到DOWN事件时收到了MOVE事件);在模拟器上鼠标点击和实际手指触碰是完全不同的处理的,导致无法点击按钮。
修改的文件和要点:
添加和实现两个接口
void setGlobalPointerEventListener(IWindow window);
boolean injectGlobalPointerEvent(in MotionEvent event, boolean sync);
frameworks/base/core/java/android/view/IWindowSession.aidl
frameworks/base/services/java/com/android/server/WindowManagerService.java
添加接口
boolean dispatchGlobalPointer(in MotionEvent event, long eventTime);
frameworks/base/core/java/android/view/IWindow.aidl
添加接口引用
frameworks/base/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
修改接口实现
frameworks/base/core/java/android/view/ViewRoot.java
frameworks/base/core/java/android/view/SurfaceView.java