• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1import { display } from '@kit.ArkUI';
2import { inputMethodEngine, InputMethodExtensionContext } from '@kit.IMEKit';
3
4// 调用输入法框架的getInputMethodAbility方法获取实例,并由此实例调用输入法框架功能接口
5const inputMethodAbility: inputMethodEngine.InputMethodAbility = inputMethodEngine.getInputMethodAbility();
6
7export class KeyboardController {
8  private mContext: InputMethodExtensionContext | undefined = undefined; // 保存InputMethodExtensionAbility中的context属性
9  private panel: inputMethodEngine.Panel | undefined = undefined;
10  private textInputClient: inputMethodEngine.InputClient | undefined = undefined;
11  private keyboardController: inputMethodEngine.KeyboardController | undefined = undefined;
12
13  constructor() {
14  }
15
16  public onCreate(context: InputMethodExtensionContext): void {
17    this.mContext = context;
18    this.initWindow(); // 初始化窗口
19    this.registerListener(); // 注册对输入法框架的事件监听
20  }
21
22  // 应用生命周期销毁
23  public onDestroy(): void {
24    this.unRegisterListener(); // 去注册事件监听
25    if(this.panel) { // 销毁窗口
26      inputMethodAbility.destroyPanel(this.panel);
27    }
28    if(this.mContext) {
29      this.mContext.destroy();
30    }
31  }
32
33  public insertText(text: string): void {
34    if(this.textInputClient) {
35      this.textInputClient.insertText(text);
36    }
37  }
38
39  public deleteForward(length: number): void {
40    if(this.textInputClient) {
41      this.textInputClient.deleteForward(length);
42    }
43  }
44
45  private initWindow(): void {
46    if(this.mContext === undefined) {
47      return;
48    }
49    let dis = display.getDefaultDisplaySync();
50    let dWidth = dis.width;
51    let dHeight = dis.height;
52    let keyHeightRate = 0.47;
53    let keyHeight = dHeight * keyHeightRate;
54    let nonBarPosition = dHeight - keyHeight;
55    let panelInfo: inputMethodEngine.PanelInfo = {
56      type: inputMethodEngine.PanelType.SOFT_KEYBOARD,
57      flag: inputMethodEngine.PanelFlag.FLG_FIXED
58    };
59    inputMethodAbility.createPanel(this.mContext, panelInfo).then(async (inputPanel: inputMethodEngine.Panel) => {
60      this.panel = inputPanel;
61      if(this.panel) {
62        await this.panel.resize(dWidth, keyHeight);
63        await this.panel.moveTo(0, nonBarPosition);
64        await this.panel.setUiContent('pages/InputPage');
65      }
66    });
67  }
68
69  private registerListener(): void {
70    this.registerInputListener(); // 注册对输入法框架服务的监听
71    // 注册隐藏键盘事件监听等
72  }
73
74  private registerInputListener(): void { // 注册对输入法框架服务的开启及停止事件监听
75    inputMethodAbility.on('inputStart', (kbController, textInputClient) => {
76      this.textInputClient = textInputClient; // 此为输入法客户端实例,由此调用输入法框架提供给输入法应用的功能接口
77      this.keyboardController = kbController;
78    })
79    inputMethodAbility.on('inputStop', () => {
80      this.onDestroy(); // 销毁KeyboardController
81    });
82  }
83
84  private unRegisterListener(): void {
85    inputMethodAbility.off('inputStart');
86    inputMethodAbility.off('inputStop', () => {});
87  }
88}
89
90const keyboardController = new KeyboardController();
91
92export default keyboardController;
93