最近正在撰写、开发的小工具,我决定所有的控件都自己实现,例如最简单的“文本输入框”,看似简单,其实内部机制很多,开发起来工作量是巨大的。
这个控件不仅要完成文字的录入,还要有“焦点”和“光标”的概念,当然要有,如果没有焦点,APP又如何知道当前是否处于输入状态、输入内容要交给页面上的哪一个控件处理呢?
光标是“焦点”的外在表现形式,当前页面上的“可聚焦”控件,谁处于“焦点”状态,谁就是拥有闪烁光标的。并且光标还要可以左移、右移、移至行首、移至行尾、上翻页、下翻页,甚至还可以跨单词移动……这些对光标的控制就已经是一个小的子功能模块了。
只有焦点和光标,只能说是完成了基本的文字录入功能,但还欠缺对“中文输入法”这样的IME输入的支持。和ascii输入不同,IME输入是有两套输入文字的,一套是预输入文字、一套是正选提交文字,两套文字要同时显示在输入框中,并且预选输入文字是会实时变化、并且可能出现在正式提交文字的任何中间区域的。这就给渲染文字带来了更复杂的逻辑,想正确实现也不是几行、几十行代码就能实现的。
简单和鼠标的控制也要考虑到,因为输入框内的文字是可以通过键盘或鼠标进行“框选”的,框选部分文字会“反色”以示意为选中状态。
单纯的“选中”是不够的,还要支持对选中的文字进行复制、剪贴,或者对光标所处位置进行文字的粘贴操作。这就又涉及到对系统粘贴板的操作。
有了复制、粘贴等功能,自然而然想到的就是这个输入框实际是有上下文菜单的,鼠标点击右键或通过键盘操作,可以唤出上下文菜单,并通过菜单进行撤销、全选、复制、粘贴、剪贴等操作。
除了上面这些功能之外,输入框内的输入内容如果是网址,可能还要做蓝色渲染和鼠标可直接点击打开等操作,这就更细化,更繁琐了。
如上,像完成一个基本的input text control,看似简单,内部机制非常繁杂。