|
http://www.evan129.com/2009/06/26/webos-input-method-design/
8 |+ } y; O3 Q2 {
; A+ X1 z: G# c- I5 W0 ^" O至今还没见过Pre真机呢,唉。前些天和streatsmart聊起,讲到pre上的中文输入法实现。我想当然地说,和android, iphone早期一样,没有输入法框架,也没SDK,估计是不怎么可能作系统级输入法的啦,哪有都像palm os这么多方式好hack的。他说,palmer@ifan提到,用js应该可以实现。虽然没有什么详细内容,我只是觉得或许也可以看下,载了webOS的rom看了下源码。发现几个textField控件的实现都是有源代码的。
7 R# X7 S2 G/ {2 {" ~可以看下如普通文本输入框的源码,在 /usr/palm/frameworks/mojo/submissions/175.7/javascripts/widget_textfield.js 。系统控件本身也有事件处理,比如当然要注册按键事件处理
; v3 y: u) \9 v# `" Z: ~- e% I* J3 a, j1 b8 F2 [, M/ V7 H O( j: W0 B
this.handleKeyDownEvent = this.handleKeyDownEvent.bind(this);
8 F$ k2 S G( m1 O& l% k9 Pthis.controller.listen(this.controller.element, "keydown", this.handleKeyDownEvent);
- ~& U, j# h' V) x, r; h6 uthis.handleKeyUpEvent = this.handleKeyUpEvent.bind(this);
9 m6 V+ S; d4 [" l; ?0 O" e# Y2 u. Nthis.controller.listen(this.controller.element, "keyup", this. handleKeyUpEvent);
% w* Y3 W+ _0 P% n8 a3 n; F9 k8 p: M; q1 l; B, R; s# O
那么就可以在handleKeyDownEvent里加入自己的代码。加一个浮动- h3 W) P; z/ {; T A- ?1 A
区域飘浮在当前的输入框上方用来显示候选词。可以取到当前textfield的绝对位置,这个框也可以定位得很精准。如果做inline式输入法,要自己绘制下划线,可能处理起来麻烦一点。要是和巨硬这类一样在外部窗口先确定字再入框的话,那只要第一个按键下去,显示输入框,剩下的就用输入框本身来处理后面的控件事件就可以。$ s, ^9 J, v& F# M4 t. W: P
这样做的好处很明显,纯js实现,不需要考虑没有SDK,编译linux native code有困难,没有接口文档,不能做通讯这些问题。缺点当然是效率会有问题。不过可以先做个单字输入法凑和着用。码表直接用一个json格式存储就好了。还有个缺点就是代码不保密,不过看起来webOS上大多程序都有这问题。! P( f5 b, s9 T
不过看了下,textfield有好几种类型,而且甚至不是相互继承的,那么就需要把输入法相关的js单独提出来作一个文件,再在各种textfield 里都调用下。相信对于标准输入框应该可以解决了。额外的,可以再做个独立的程序(或者直接用memo程序也行),输入字后可以复制粘贴,用于一些特殊的不能生效的情况。
0 K6 [) k$ S( R( S. K有了root权限,替换和写入这些js文件应该没有什么问题。- O Q( {) M: @1 Y4 Z; T n
! k N, {( n; z4 _; X+ Q
嗯,最后是版权声明。如果您使用了这种方式来实现webOS上的输入法的话,希望能声明想法来源,及标明本页链接。 |
|