【HarmonyOS 6】在UI控件上滑動也會觸發onClick點擊事件?

一、問題背景

最近忙了幾個月的HarmonyOS 6 AI項目已提測。測試老鐵們和領導們瘋狂的使用,提出了很多奇奇怪怪的問題。

如題所述,項目中有個全屏提示遮罩,背景設置了點擊事件。點擊後隱藏遮罩。 在這裏插入圖片描述

測試代碼如下:


/**
 * 點擊測試頁面
 */
@Entry
@Component
struct ClickTestPage {

  build() {
    Column() {
      Text("提示文本123456")
        .fontSize($r('app.float.page_text_font_size'))
        .fontWeight(FontWeight.Bold)
    }
    .height('100%')
    .width('100%')
    .justifyContent(FlexAlign.Center)
    .onClick(() => {
      // 觸發點擊
      this.getUIContext().getPromptAction().showToast({
        message: "點擊了!"
      })
    })
    .backgroundColor(Color.Red)
  }
}

領導們體驗時發現,在UI控件上滑動也會觸發onClick點擊事件,關閉提示遮罩。

按照我的定位思路,因為只有onclick觸發了隱藏操作,所以加了日誌去復現,發現果然如此。就把bug劃分到非問題欄裏了。

後來項目內技術大佬發現,該問題可解,由此產生本文解答。

自我檢討,對於問題的敏感性和探索性有所降低,需要警惕!

二、解決方案:

因為onClick點擊事件是組件被點擊時觸發的事件,因此滑動後抬起手指也會觸發onClick事件。

不過從API12,新增distanceThreshold參數,設置點擊手勢移動閾值。手指移動超出閾值時,點擊手勢識別失敗。

在這裏插入圖片描述 比起傳統onclick事件,多了一個參數,可以設置移動閾值distanceThreshold。

當點擊事件,設置了移動閾值distanceThreshold。當設置的值小於等於0時,會被轉化為默認值。默認值:2^31-1,單位:vp。

當手指的移動距離超出開發者預設的移動閾值時,點擊識別失敗。如果初始化為默認閾值時,手指移動超過組件熱區範圍,點擊識別失敗。

話説API12版本還是太權威了,去年居然沒有注意到這些細節!!!

所以該問題如下修改測試代碼即可:


/**
 * 點擊測試頁面
 */
@Entry
@Component
struct ClickTestPage {

  build() {
    Column() {
      Text("提示文本123456")
        .fontSize($r('app.float.page_text_font_size'))
        .fontWeight(FontWeight.Bold)
    }
    .height('100%')
    .width('100%')
    .justifyContent(FlexAlign.Center)
    .onClick(() => {
      // 觸發點擊
      this.getUIContext().getPromptAction().showToast({
        message: "點擊了!"
      })
      // 設置移動閾值distanceThreshol為1
    },1)
    .backgroundColor(Color.Red)
  }
}

onClick事件中增加distanceThreshold參數,將閾值設置為一個極小值1,當手指的移動距離超出預設的移動閾值時,點擊識別失敗,即不觸發點擊事件。