鴻蒙OS 多模輸入開發(fā)指導(dǎo)

2020-09-18 14:06 更新

場(chǎng)景介紹

多模輸入使 HarmonyOS 的 UI 控件能夠響應(yīng)多種輸入事件,事件來源于用戶的按鍵、點(diǎn)擊、觸屏、語(yǔ)音等。例如用戶希望通過語(yǔ)音操作UI控件,那么開發(fā)者可以通過多模輸入在智慧屏產(chǎn)品上提供的語(yǔ)音事件達(dá)到“可見即可說”的效果。

接口說明

多模輸入的接口設(shè)計(jì)是基于多模事件基類(MultimodalEvent),派生出操作事件類(ManipulationEvent)、按鍵事件類(KeyEvent)、語(yǔ)音事件(SpeechEvent)等,詳細(xì)見[圖1]。

圖1 多模輸入事件類的派生關(guān)系 點(diǎn)擊放大

  • MultimodalEvent 是所有事件的基類,該類中定義了一系列高級(jí)事件類型,這些事件類型通常是對(duì)某種行為或意圖的抽象。
功能分類 接口名 描述
設(shè)備信息相關(guān) getDeviceId() 獲取輸入設(shè)備所在的承載設(shè)備 id,如當(dāng)同時(shí)有兩個(gè)鼠標(biāo)連接到一個(gè)機(jī)器上,該機(jī)器為這兩個(gè)鼠標(biāo)的承載設(shè)備。
getInputDeviceId() 獲取產(chǎn)生當(dāng)前事件的輸入設(shè)備 id,該 id 是該輸入設(shè)備的唯一標(biāo)識(shí),如兩個(gè)鼠標(biāo)同時(shí)輸入時(shí),它們會(huì)分別產(chǎn)生輸入事件,且從事件中獲取到的 deviceid 是不同的,開發(fā)者可以將此 id 用來區(qū)分實(shí)際的輸入設(shè)備源。
getSourceDevice() 獲取產(chǎn)生當(dāng)前事件的輸入設(shè)備類型。
時(shí)間 getOccurredTime() 獲取產(chǎn)生當(dāng)前事件的時(shí)間。
事件 getUuid() 獲取事件的UUID。
isSameEvent(UUID id) 判斷當(dāng)前事件與傳入 id 的事件是否為同一事件。

  • CompositeEvent 處理常用設(shè)備對(duì)應(yīng)的事件,目前暫時(shí)只有 MouseEvent 事件繼承該類。

  • RotationEvent 處理由旋轉(zhuǎn)器件產(chǎn)生的事件,比如智能穿戴上的數(shù)字表冠。
功能分類 接口名 描述
旋轉(zhuǎn)器信息 getRotationValue() 獲取旋轉(zhuǎn)器件旋轉(zhuǎn)產(chǎn)生的值。

  • SpeechEvent 處理語(yǔ)音事件,開發(fā)者可以通過該類獲取語(yǔ)音識(shí)別結(jié)果。
功能分類 接口名 描述
構(gòu)造函數(shù) public static Optional<SpeechEvent> createEvent(long occurTime, int action, String value) SpeechEvent 創(chuàng)建函數(shù)。
獲取語(yǔ)音事件參數(shù)值 public int getAction() 獲取當(dāng)前動(dòng)作的類型,如打開、關(guān)閉、命中熱詞。
public int getScene() 獲取當(dāng)前動(dòng)作時(shí)的場(chǎng)景。
public String getActionProperty() 獲取動(dòng)作所攜帶的屬性值。
public int getMatchMode() 獲取識(shí)別結(jié)果的匹配模式。

  • ManipulationEvent 操作類事件主要包括手指觸摸事件等事件,是對(duì)這些事件的一個(gè)抽象。該事件會(huì)持有事件發(fā)生的位置信息和發(fā)生的階段等信息。通常情況下,該事件主要是作為操作回調(diào)接口的入?yún)ⅲ_發(fā)者通過回調(diào)接口捕獲及處理事件。回調(diào)接口將操作分為開始、操作過程中、結(jié)束。例如對(duì)于一次手指觸控,手指接觸屏幕作為操作開始,手指在屏幕上移動(dòng)作為操作過程,手指抬起作為操作結(jié)束。
功能分類 接口名 描述
手指信息 getPointerCount() 獲取一次事件中觸控或軌跡追蹤的指針數(shù)量。
getPointerId(int index) 獲取一次事件中,指針的唯一標(biāo)識(shí) Id。
setScreenOffset(float offsetX, float offsetY) 設(shè)置相對(duì)屏幕坐標(biāo)原點(diǎn)的偏移位置信息。
getPointerPosition(int index) 獲取一次事件中觸控或軌跡追蹤的某個(gè)指針相對(duì)于偏移位置的坐標(biāo)信息。
getPointerScreenPosition(int index) 獲取一次事件中觸控或軌跡追蹤的某個(gè)指針相對(duì)屏幕坐標(biāo)原點(diǎn)的坐標(biāo)信息。
getRadius(int index) 返回給定index手指與屏幕接觸的半徑值。
getForce(int index) 獲取給定index手指觸控的壓力值。
時(shí)間 getStartTime() 獲取操作開始階段時(shí)間。
階段 getPhase() 事件所屬階段。

  • KeyEvent 對(duì)所有按鍵類事件的定義,該類繼承 MultimodalEvent 類,并對(duì)按鍵類事件做了專屬的 Keycode 定義以及方法封裝。
功能分類 接口名 描述
KeyCode getKeyCode() 獲取當(dāng)前按鍵類事件的 keycode 值。
getMaxKeyCode() 獲取當(dāng)前定義的按鍵類事件的最大 keycode 值。
按鍵按下狀態(tài) getKeyDownDuration() 獲取當(dāng)前按鍵截止該接口被調(diào)用時(shí)被按下的時(shí)長(zhǎng)。
isKeyDown() 獲取當(dāng)前按鍵事件的按下狀態(tài)。

  • TouchEvent 處理手指觸控相關(guān)事件。
功能分類 接口名 描述
觸控行為 getAction() 獲取當(dāng)前觸摸行為。
getIndex() 獲取發(fā)生行為的對(duì)應(yīng)指針。

  • KeyBoardEvent 處理鍵盤類設(shè)備的事件。
功能分類 接口名 描述
輸入法編輯器 enableIme() 啟動(dòng)輸入法編輯器。
disableIme() 關(guān)閉輸入法編輯器。
isHandledByIme() 判斷輸入法編輯器是否在使用。
NoncharacterKey行為 isNoncharacterKeyPressed(int keycode) 判定輸入的單個(gè) NoncharacterKey 是否處于按下狀態(tài)。
isNoncharacterKeyPressed(int keycode1, int keycode2) 判定輸入的兩個(gè) NoncharacterKey 是否都處于按下狀態(tài)。
isNoncharacterKeyPressed(int keycode1, int keycode2, int keycode3) 判定輸入的三個(gè) NoncharacterKey 是否都處于按下狀態(tài)。
按鍵Unicode碼 getUnicode() 獲取按鍵對(duì)應(yīng)的Unicode碼。

說明

NoncharacterKey 為除了文本可見字符(A-Z,0-9,空格,逗號(hào),句號(hào)等)以外的按鍵碼,例如:Ctrl,Alt,Shift 等。

  • MouseEvent 處理鼠標(biāo)的事件。
功能分類 接口名 描述
鼠標(biāo)行為 getAction() 獲取鼠標(biāo)設(shè)備產(chǎn)生事件的行為。
鼠標(biāo)按鍵 getActionButton() 獲取狀態(tài)發(fā)生變化的鼠標(biāo)按鍵。
getPressedButtons() 獲取所有按下狀態(tài)的鼠標(biāo)按鍵。
鼠標(biāo)指針/位置 getCursor() 獲取鼠標(biāo)指針的位置。
getCursorDelta(int axis) 獲取鼠標(biāo)指針位置相對(duì)上次的變化值。
setCursorOffset(float offsetX, float offsetY) 設(shè)置相對(duì)屏幕的偏移位置信息。
鼠標(biāo)滾輪 getScrollingDelta(int axis) 獲取滾輪的滾動(dòng)值。

  • MmiPoint處理在指定給定的坐標(biāo)系中的 x,y 和 z 坐標(biāo)。
功能分類 接口名 描述
構(gòu)造函數(shù) MmiPoint(float px, float py) 創(chuàng)建一個(gè)只包含 x 和 y 坐標(biāo)的 MmiPoint 對(duì)象。
MmiPoint(float px, float py, float pz) 創(chuàng)建一個(gè)包含 x,y 和 z 坐標(biāo)的 MmiPoint 對(duì)象。
坐標(biāo)值 getX() 獲取x坐標(biāo)值。
getY() 獲取y坐標(biāo)值。
getZ() 獲取z坐標(biāo)值。
toString() 返回包含x、y、z坐標(biāo)值信息的字符串

開發(fā)步驟

處理按鈕事件

  1. 參考 HarmonyOS 的 Component 的 API 創(chuàng)建 KeyEventListener;

  1. 重寫實(shí)現(xiàn) KeyEventListener 類中的onKeyEvent(Component component, KeyEvent event)方法;

  1. 開發(fā)者根據(jù)自身需求處理存在按鍵被按下以及 KEY_DPAD_CENTER、KEY_DPAD_LEFT 等按鍵被按下后的具體實(shí)現(xiàn)。

   private Component.KeyEventListener onKeyEvent = new Component.KeyEventListener() 
   {
       @Override
       public boolean onKeyEvent(Component component, KeyEvent keyEvent) {
           if (keyEvent.isKeyDown()) {
               ... // 檢測(cè)到按鍵被按下,開發(fā)者根據(jù)自身需求進(jìn)行實(shí)現(xiàn)
           }
           int keycode = keyEvent.getKeyCode();
           switch (keycode) {
               case KeyEvent.KEY_DPAD_CENTER:
                   ... // 檢測(cè)到KEY_DPAD_CENTER被按下,開發(fā)者根據(jù)自身需求進(jìn)行實(shí)現(xiàn)
                   break;
               case KeyEvent.KEY_DPAD_LEFT:
                   ... // 檢測(cè)到KEY_DPAD_LEFT被按下,開發(fā)者根據(jù)自身需求進(jìn)行實(shí)現(xiàn)
                   break;
               case KeyEvent.KEY_DPAD_UP:
                   ... // 檢測(cè)到KEY_DPAD_UP被按下,開發(fā)者根據(jù)自身需求進(jìn)行實(shí)現(xiàn)
                   break;
               case KeyEvent.KEY_DPAD_RIGHT:
                   ... // 檢測(cè)到KEY_DPAD_RIGHT被按下,開發(fā)者根據(jù)自身需求進(jìn)行實(shí)現(xiàn)
                   break;
               case KeyEvent.KEY_DPAD_DOWN:
                   ... // 檢測(cè)到KEY_DPAD_DOWN被按下,開發(fā)者根據(jù)自身需求進(jìn)行實(shí)現(xiàn)
                   break;
               default:
                   break;
           }
           ... 
       }
   };

處理語(yǔ)音事件

使用多模輸入的語(yǔ)音事件實(shí)現(xiàn)“可見即可說”的效果簡(jiǎn)易開發(fā)樣例參考可見即可說開發(fā)指導(dǎo)

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)