綁定手勢方法
為組件綁定不同類型的手勢事件,并設置事件的響應方法。
說明:
開發前請熟悉鴻蒙開發指導文檔 :[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]點擊或者復制轉到。
從API Version 7開始支持。后續版本如有新增內容,則采用上角標單獨標記該內容的起始版本。
綁定手勢識別
通過如下屬性給組件綁定手勢識別,手勢識別成功后可以通過事件回調通知組件。
名稱 | 參數類型 | 默認值 | 描述 |
---|---|---|---|
gesture | gesture: [GestureType], mask?: [GestureMask] | gesture: -, mask: GestureMask.Normal | 綁定手勢。 - gesture: 綁定的手勢類型, - mask: 事件響應設置。 |
priorityGesture | gesture: [GestureType], mask?: [GestureMask] | gesture: -, mask: GestureMask.Normal | 綁定優先識別手勢。 - gesture: 綁定的手勢類型, - mask: 事件響應設置。 1、默認情況下,子組件優先識別通過gesture綁定的手勢,當父組件配置priorityGesture時,父組件優先識別priorityGesture綁定的手勢。 2、長按手勢時,設置觸發長按的最短時間小的組件會優先響應,會忽略priorityGesture設置。 |
parallelGesture | gesture: [GestureType], mask?: [GestureMask] | gesture: -, mask: GestureMask.Normal | 綁定可與子組件手勢同時觸發的手勢。 - gesture: 綁定的手勢類型。 - mask: 事件響應設置。 手勢事件為非冒泡事件。父組件設置parallelGesture時,父子組件相同的手勢事件都可以觸發,實現類似冒泡效果。若父子組件中同時綁定單擊手勢事件和雙擊手勢事件,則只響應單擊手勢事件。 |
GestureType
名稱 | 描述 |
---|---|
[TapGesture] | 點擊手勢,支持單次點擊、多次點擊識別。 |
[LongPressGesture] | 長按手勢。 |
[PanGesture] | 平移手勢,滑動最小距離為5vp時識別成功。 |
[PinchGesture] | 捏合手勢。 |
[RotationGesture] | 旋轉手勢。 |
[SwipeGesture] | 滑動手勢,滑動最小速度為100vp/s時識別成功。 |
[GestureGroup] | 手勢識別組,多種手勢組合為復合手勢,支持連續識別、并行識別和互斥識別。 |
GestureMask枚舉說明
名稱 | 描述 |
---|---|
Normal | 不屏蔽子組件的手勢,按照默認手勢識別順序進行識別。 |
IgnoreInternal | 屏蔽子組件的手勢,包括子組件上系統內置的手勢,如子組件為List組件時,內置的滑動手勢同樣會被屏蔽。 |
響應手勢事件
組件通過手勢事件綁定不同GestureType的手勢對象,各手勢對象在響應手勢操作的事件回調中提供手勢相關信息。下面通過TapGesture手勢對象的onAction事件響應點擊事件,獲取事件相關信息。其余手勢對象的事件定義見各個手勢對象章節。 若需綁定多種手勢請使用 [組合手勢]。
TapGesture事件說明
名稱 | 功能描述 |
---|---|
onAction((event?:GestureEvent) => void) | Tap手勢識別成功回調。 |
GestureEvent對象說明
名稱 | 類型 | 描述 |
---|---|---|
repeat | boolean | 是否為重復觸發事件,用于LongPressGesture手勢觸發場景。 |
offsetX | number | 手勢事件x軸相對偏移量,單位為vp,用于PanGesture手勢觸發場景,從左向右滑動offsetX為正,反之為負。 |
offsetY | number | 手勢事件y軸相對偏移量,單位為vp,用于PanGesture手勢觸發場景,從上向下滑動offsetY為正,反之為負。 |
angle | number | 用于RotationGesture手勢觸發場景時,表示旋轉角度。 用于SwipeGesture手勢觸發場景時,表示滑動手勢的角度,即兩根手指間的線段與水平方向的夾角變化的度數。**說明:**角度計算方式:滑動手勢被識別到后,連接兩根手指之間的線被識別為起始線條,隨著手指的滑動,手指之間的線條會發生旋轉,根據起始線條兩端點和當前線條兩端點的坐標,使用反正切函數分別計算其相對于水平方向的夾角,最后arctan2(cy2-cy1,cx2-cx1)-arctan2(y2-y1,x2-x1)為旋轉的角度。以起始線條為坐標系,順時針旋轉為0到180度,逆時針旋轉為-180到0度。 |
scale | number | 縮放比例,用于PinchGesture手勢觸發場景。 |
pinchCenterX | number | 捏合手勢中心點相對于當前組件元素左上角x軸坐標,單位為vp,用于PinchGesture手勢觸發場景。 |
pinchCenterY | number | 捏合手勢中心點相對于當前組件元素左上角y軸坐標,單位為vp,用于PinchGesture手勢觸發場景。 |
speed8+ | number | 滑動手勢速度,即所有手指滑動的平均速度,單位為vp/秒,用于SwipeGesture手勢觸發場景。 |
fingerList8+ | [FingerInfo] | 觸發事件的所有手指信息,用于LongPressGesture與TapGesture手勢觸發場景。 |
timestamp8+ | number | 事件時間戳。 |
target8+ | [EventTarget] | 觸發手勢事件的元素對象顯示區域。 |
source8+ | [SourceType] | 事件輸入設備。 |
pressure9+ | number | 按壓的壓力大小。 |
tiltX9+ | number | 手寫筆在設備平面上的投影與設備平面X軸的夾角。 |
tiltY9+ | number | 手寫筆在設備平面上的投影與設備平面Y軸的夾角。 |
sourceTool9+ | [SourceTool] | 事件輸入源。 |
velocityX10+ | number | 用于[PanGesture]手勢中,獲取當前手勢的x軸方向速度。坐標軸原點為屏幕左上角,分正負方向速度,從左往右為正,反之為負。 |
velocityY10+ | number | 用于[PanGesture]手勢中,獲取當前手勢的y軸方向速度。坐標軸原點為屏幕左上角,分正負方向速度,從上往下為正,反之為負。 |
velocity10+ | number | 用于[PanGesture]手勢中,獲取當前手勢的主方向速度。為xy軸方向速度的平方和的算術平方根。 |
SourceType枚舉說明
名稱 | 描述 |
---|---|
Unknown | 未知設備。 |
Mouse | 鼠標。 |
TouchScreen | 觸摸屏。 |
FingerInfo對象說明
名稱 | 類型 | 描述 |
---|---|---|
id | number | 手指的索引編號。 |
globalX | number | 相對于應用窗口左上角的x軸坐標。 |
globalY | number | 相對于應用窗口左上角的y軸坐標。 |
localX | number | 相對于當前組件元素左上角的x軸坐標。 |
localY | number | 相對于當前組件元素左上角的y軸坐標。 |
SourceTool枚舉說明
名稱 | 描述 |
---|---|
Unknown | 未知輸入源。 |
Finger | 手指輸入。 |
Pen | 手寫筆輸入。HarmonyOS與OpenHarmony鴻蒙文檔籽料:mau123789是v直接拿 |
示例
// xxx.ets
@Entry
@Component
struct GestureSettingsExample {
@State priorityTestValue: string = ''
@State parallelTestValue: string = ''
build() {
Column() {
Column() {
Text('TapGesture:' + this.priorityTestValue).fontSize(28)
.gesture(
TapGesture()
.onAction(() = > {
this.priorityTestValue += 'nText'
}))
}
.height(200)
.width(250)
.padding(20)
.margin(20)
.border({ width: 3 })
// 設置為priorityGesture時,點擊文本會忽略Text組件的TapGesture手勢事件,優先識別父組件Column的TapGesture手勢事件
.priorityGesture(
TapGesture()
.onAction((event: GestureEvent) = > {
this.priorityTestValue += 'nColumn'
}), GestureMask.IgnoreInternal)
Column() {
Text('TapGesture:' + this.parallelTestValue).fontSize(28)
.gesture(
TapGesture()
.onAction(() = > {
this.parallelTestValue += 'nText'
}))
}
.height(200)
.width(250)
.padding(20)
.margin(20)
.border({ width: 3 })
// 設置為parallelGesture時,點擊文本會同時觸發子組件Text與父組件Column的TapGesture手勢事件
.parallelGesture(
TapGesture()
.onAction((event: GestureEvent) = > {
this.parallelTestValue += 'nColumn'
}), GestureMask.Normal)
}
}
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
組件
+關注
關注
1文章
512瀏覽量
17838 -
手勢
+關注
關注
0文章
7瀏覽量
5023 -
鴻蒙
+關注
關注
57文章
2358瀏覽量
42876
發布評論請先 登錄
相關推薦
HarmonyOS/OpenHarmony(Stage模型)應用開發手勢綁定方法
通過給各個組件綁定不同的手勢事件,并設計事件的響應方式,當手勢識別成功時,ArkUI框架將通過事件回調通知組件手勢識別的結果。
一、gesture(常規
發表于 08-29 15:24
HarmonyOS/OpenHarmony(Stage模型)應用開發組合手勢(一)連續識別
組合手勢由多種單一手勢組合而成,通過在GestureGroup中使用不同的GestureMode來聲明該組合手勢的類型,支持連續識別、并行識
發表于 09-07 15:20
鴻蒙ArkTS聲明式開發:跨平臺支持列表【形狀裁剪】 通用屬性
參數為相應類型的組件,按指定的形狀對當前組件進行裁剪;參數為boolean類型時,設置是否按照父容器邊緣輪廓進行裁剪。 默認值:false 從API version 9開始,該接口支持在ArkTS卡片中使用。
評論