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