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

2020-09-18 14:06 更新

場景介紹

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

接口說明

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

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

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

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

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

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

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

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

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

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

說明

NoncharacterKey 為除了文本可見字符(A-Z,0-9,空格,逗號,句號等)以外的按鍵碼,例如: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)指針位置相對上次的變化值。
setCursorOffset(float offsetX, float offsetY) 設(shè)置相對屏幕的偏移位置信息。
鼠標(biāo)滾輪 getScrollingDelta(int axis) 獲取滾輪的滾動值。

  • MmiPoint處理在指定給定的坐標(biāo)系中的 x,y 和 z 坐標(biāo)。
功能分類 接口名 描述
構(gòu)造函數(shù) MmiPoint(float px, float py) 創(chuàng)建一個只包含 x 和 y 坐標(biāo)的 MmiPoint 對象。
MmiPoint(float px, float py, float pz) 創(chuàng)建一個包含 x,y 和 z 坐標(biāo)的 MmiPoint 對象。
坐標(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. 重寫實現(xiàn) KeyEventListener 類中的onKeyEvent(Component component, KeyEvent event)方法;

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

  1. private Component.KeyEventListener onKeyEvent = new Component.KeyEventListener()
  2. {
  3. @Override
  4. public boolean onKeyEvent(Component component, KeyEvent keyEvent) {
  5. if (keyEvent.isKeyDown()) {
  6. ... // 檢測到按鍵被按下,開發(fā)者根據(jù)自身需求進(jìn)行實現(xiàn)
  7. }
  8. int keycode = keyEvent.getKeyCode();
  9. switch (keycode) {
  10. case KeyEvent.KEY_DPAD_CENTER:
  11. ... // 檢測到KEY_DPAD_CENTER被按下,開發(fā)者根據(jù)自身需求進(jìn)行實現(xiàn)
  12. break;
  13. case KeyEvent.KEY_DPAD_LEFT:
  14. ... // 檢測到KEY_DPAD_LEFT被按下,開發(fā)者根據(jù)自身需求進(jìn)行實現(xiàn)
  15. break;
  16. case KeyEvent.KEY_DPAD_UP:
  17. ... // 檢測到KEY_DPAD_UP被按下,開發(fā)者根據(jù)自身需求進(jìn)行實現(xiàn)
  18. break;
  19. case KeyEvent.KEY_DPAD_RIGHT:
  20. ... // 檢測到KEY_DPAD_RIGHT被按下,開發(fā)者根據(jù)自身需求進(jìn)行實現(xiàn)
  21. break;
  22. case KeyEvent.KEY_DPAD_DOWN:
  23. ... // 檢測到KEY_DPAD_DOWN被按下,開發(fā)者根據(jù)自身需求進(jìn)行實現(xiàn)
  24. break;
  25. default:
  26. break;
  27. }
  28. ...
  29. }
  30. };

處理語音事件

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

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號