監(jiān)聽(tīng)鍵盤(pán)實(shí)時(shí)彈窗、收起狀態(tài) - 鴻蒙 HarmonyOS Next

監(jiān)聽(tīng)鍵盤(pán)實(shí)時(shí)彈窗、收起狀態(tài),可以通過(guò)獲取鍵盤(pán)高度的變化來(lái)判定,也可以通過(guò)監(jiān)測(cè)當(dāng)前窗口系統(tǒng)規(guī)避區(qū)域的變化,兩種方式皆可;

監(jiān)測(cè)鍵盤(pán)高度變化

  /**
   * 監(jiān)聽(tīng)鍵盤(pán)顯示或隱藏狀態(tài)
   * state : 0 收起 & 1 彈出 & 2 變更
   * keyboardHeight : 鍵盤(pán)高度 number
   * V3.4.62
   * 20250306
   * */
  static listenKeyboardState() {
    console.info('[事件監(jiān)聽(tīng)] - 鍵盤(pán)');
    /**
     * 通過(guò) window 模塊的 on('keyboardHeightChange')方法
     * 監(jiān)聽(tīng)軟鍵盤(pán)高度變化,實(shí)時(shí)獲取軟鍵盤(pán)高度,默認(rèn)初始隱藏狀態(tài)為 0
     * */
    let keyboardHeight: number = 0; // 軟鍵盤(pán)高度
    window.getLastWindow(getContext(_this)).then(currentWindow => {
      currentWindow.on('keyboardHeightChange', (data: number) => {
        keyboardHeight = px2vp(data);
        console.info(`[事件監(jiān)聽(tīng)] - 鍵盤(pán) - 高度: ${keyboardHeight}`);
        if (0 == keyboardHeight) {
          console.info('[事件監(jiān)聽(tīng)] - 鍵盤(pán) - 收起');
          // 通知對(duì)應(yīng)模塊業(yè)務(wù)當(dāng)前狀態(tài)
         EmitterCenter.shareInstance().post(EmitterKey.Emitter_KeyboardChangeState, new Object({
            state: '0',
            keyboardHeight: keyboardHeight,
          }));
        } else {
          console.info('[事件監(jiān)聽(tīng)] - 鍵盤(pán) - 彈出');
          // 通知對(duì)應(yīng)模塊業(yè)務(wù)當(dāng)前狀態(tài)
         EmitterCenter.shareInstance().post(EmitterKey.Emitter_KeyboardChangeState, new Object({
            state: '1',
            keyboardHeight: keyboardHeight,
          }));
        }
      });
    });
  }

監(jiān)測(cè)窗口系統(tǒng)規(guī)避去變化

  /**
   * 監(jiān)聽(tīng)鍵盤(pán)顯示或隱藏狀態(tài)
   * state : 0 收起 & 1 彈出 & 2 變更
   * keyboardHeight : 鍵盤(pán)高度 number
   * V3.4.62
   * 20250306
   * */
  static listenKeyboardState() {
    console.info('[事件監(jiān)聽(tīng)] - 鍵盤(pán)');
    /**
     * 通過(guò) window 模塊的 on('avoidAreaChange')方式
     * 開(kāi)啟當(dāng)前窗口系統(tǒng)規(guī)避區(qū)變化的監(jiān)聽(tīng),獲取內(nèi)容可視區(qū)域大小;
     * 以此來(lái)監(jiān)聽(tīng)軟鍵盤(pán)彈出與收起狀態(tài).
     * */
    let screenHeight: number = 0; // 安全區(qū)域高度
    let isKeyBoardHidden: boolean = false; // 軟鍵盤(pán)是否隱藏
    window.getLastWindow(getContext(_this)).then(currentWindow => {
      let property = currentWindow.getWindowProperties();
      let avoidArea = currentWindow.getWindowAvoidArea(window.AvoidAreaType.TYPE_KEYBOARD);
      // 初始化顯示區(qū)域高度
      screenHeight = px2vp(property.windowRect.height - avoidArea.topRect.height - avoidArea.bottomRect.height);
      // 開(kāi)啟當(dāng)前窗口系統(tǒng)規(guī)避區(qū)變化的監(jiān)聽(tīng)
      currentWindow.on('avoidAreaChange', data => {
        if (data.type !== window.AvoidAreaType.TYPE_KEYBOARD) {
          return;
        }
 
        if (0 >= data.area.bottomRect.height) {
          isKeyBoardHidden = true;
          console.info('[事件監(jiān)聽(tīng)] - 鍵盤(pán) - 隱藏');
        } else {
          isKeyBoardHidden = false;
          console.info('[事件監(jiān)聽(tīng)] - 鍵盤(pán) - 顯示');
        }
 
        screenHeight = px2vp(property.windowRect.height - data.area.topRect.height - data.area.bottomRect.height);
        console.info(`[事件監(jiān)聽(tīng)] - Screen height: ${screenHeight}`);
      });
    });
  }

以上便是此次分享的全部?jī)?nèi)容,希望能對(duì)大家有所幫助!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容