單一手勢

2024-02-07 12:50 更新

點擊手勢(TapGesture)

  1. TapGesture(value?:{count?:number; fingers?:number})

點擊手勢支持單次點擊和多次點擊,擁有兩個可選參數(shù):

  • count:非必填參數(shù),聲明該點擊手勢識別的連續(xù)點擊次數(shù)。默認值為1,若設(shè)置小于1的非法值會被轉(zhuǎn)化為默認值。如果配置多次點擊,上一次抬起和下一次按下的超時時間為300毫秒。
  • fingers:非必填參數(shù),用于聲明觸發(fā)點擊的手指數(shù)量,最小值為1,最大值為10,默認值為1。當(dāng)配置多指時,若第一根手指按下300毫秒內(nèi)未有足夠的手指數(shù)按下則手勢識別失敗。當(dāng)實際點擊手指數(shù)超過配置值時,手勢識別失敗。
    以在Text組件上綁定雙擊手勢(count值為2的點擊手勢)為例:
    1. // xxx.ets
    2. @Entry
    3. @Component
    4. struct Index {
    5. @State value: string = "";
    6. build() {
    7. Column() {
    8. Text('Click twice').fontSize(28)
    9. .gesture(
    10. // 綁定count為2的TapGesture
    11. TapGesture({ count: 2 })
    12. .onAction((event: GestureEvent) => {
    13. this.value = JSON.stringify(event.fingerList[0]);
    14. }))
    15. Text(this.value)
    16. }
    17. .height(200)
    18. .width(250)
    19. .padding(20)
    20. .border({ width: 3 })
    21. .margin(30)
    22. }
    23. }

長按手勢(LongPressGesture)

  1. LongPressGesture(value?:{fingers?:number; repeat?:boolean; duration?:number})

長按手勢用于觸發(fā)長按手勢事件,觸發(fā)長按手勢的最少手指數(shù)量為1,最短長按事件為500毫秒,擁有三個可選參數(shù):

  • fingers:非必選參數(shù),用于聲明觸發(fā)長按手勢所需要的最少手指數(shù)量,最小值為1,最大值為10,默認值為1。
  • repeat:非必選參數(shù),用于聲明是否連續(xù)觸發(fā)事件回調(diào),默認值為false。
  • duration:非必選參數(shù),用于聲明觸發(fā)長按所需的最短時間,單位為毫秒,默認值為500。

以在Text組件上綁定可以重復(fù)觸發(fā)的長按手勢為例:

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct Index {
  5. @State count: number = 0;
  6. build() {
  7. Column() {
  8. Text('LongPress OnAction:' + this.count).fontSize(28)
  9. .gesture(
  10. // 綁定可以重復(fù)觸發(fā)的LongPressGesture
  11. LongPressGesture({ repeat: true })
  12. .onAction((event: GestureEvent) => {
  13. if (event.repeat) {
  14. this.count++;
  15. }
  16. })
  17. .onActionEnd(() => {
  18. this.count = 0;
  19. })
  20. )
  21. }
  22. .height(200)
  23. .width(250)
  24. .padding(20)
  25. .border({ width: 3 })
  26. .margin(30)
  27. }
  28. }

拖動手勢(PanGesture)

  1. PanGesture(value?:{ fingers?:number; direction?:PanDirection; distance?:number})

拖動手勢用于觸發(fā)拖動手勢事件,滑動達到最小滑動距離(默認值為5vp)時拖動手勢識別成功,擁有三個可選參數(shù):

  • fingers:非必選參數(shù),用于聲明觸發(fā)拖動手勢所需要的最少手指數(shù)量,最小值為1,最大值為10,默認值為1。
  • direction:非必選參數(shù),用于聲明觸發(fā)拖動的手勢方向,此枚舉值支持邏輯與(&)和邏輯或(|)運算。默認值為Pandirection.All。
  • distance:非必選參數(shù),用于聲明觸發(fā)拖動的最小拖動識別距離,單位為vp,默認值為5。

以在Text組件上綁定拖動手勢為例,可以通過在拖動手勢的回調(diào)函數(shù)中修改組件的布局位置信息來實現(xiàn)組件的拖動:

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct Index {
  5. @State offsetX: number = 0;
  6. @State offsetY: number = 0;
  7. @State positionX: number = 0;
  8. @State positionY: number = 0;
  9. build() {
  10. Column() {
  11. Text('PanGesture Offset:\nX: ' + this.offsetX + '\n' + 'Y: ' + this.offsetY)
  12. .fontSize(28)
  13. .height(200)
  14. .width(300)
  15. .padding(20)
  16. .border({ width: 3 })
  17. // 在組件上綁定布局位置信息
  18. .translate({ x: this.offsetX, y: this.offsetY, z: 0 })
  19. .gesture(
  20. // 綁定拖動手勢
  21. PanGesture()
  22. .onActionStart((event: GestureEvent) => {
  23. console.info('Pan start');
  24. })
  25. // 當(dāng)觸發(fā)拖動手勢時,根據(jù)回調(diào)函數(shù)修改組件的布局位置信息
  26. .onActionUpdate((event: GestureEvent) => {
  27. this.offsetX = this.positionX + event.offsetX;
  28. this.offsetY = this.positionY + event.offsetY;
  29. })
  30. .onActionEnd(() => {
  31. this.positionX = this.offsetX;
  32. this.positionY = this.offsetY;
  33. })
  34. )
  35. }
  36. .height(200)
  37. .width(250)
  38. }
  39. }

說明

大部分可滑動組件,如List、Grid、Scroll、Tab等組件是通過PanGesture實現(xiàn)滑動,在組件內(nèi)部的子組件綁定拖動手勢(PanGesture)或者滑動手勢(SwipeGesture)會導(dǎo)致手勢競爭。

當(dāng)在子組件綁定PanGesture時,在子組件區(qū)域進行滑動僅觸發(fā)子組件的PanGesture。如果需要父組件響應(yīng),需要通過修改手勢綁定方法或者子組件向父組件傳遞消息進行實現(xiàn),或者通過修改父子組件的PanGesture參數(shù)distance使得拖動更靈敏。當(dāng)子組件綁定SwipeGesture時,由于PanGesture和SwipeGesture觸發(fā)條件不同,需要修改PanGesture和SwipeGesture的參數(shù)以達到所需效果。

捏合手勢(PinchGesture)

  1. PinchGesture(value?:{fingers?:number; distance?:number})

捏合手勢用于觸發(fā)捏合手勢事件,觸發(fā)捏合手勢的最少手指數(shù)量為2指,最大為5指,最小識別距離為5vp,擁有兩個可選參數(shù):

  • fingers:非必選參數(shù),用于聲明觸發(fā)捏合手勢所需要的最少手指數(shù)量,最小值為2,最大值為5,默認值為2。
  • distance:非必選參數(shù),用于聲明觸發(fā)捏合手勢的最小距離,單位為vp,默認值為5。

以在Column組件上綁定三指捏合手勢為例,可以通過在捏合手勢的函數(shù)回調(diào)中獲取縮放比例,實現(xiàn)對組件的縮小或放大:

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct Index {
  5. @State scaleValue: number = 1;
  6. @State pinchValue: number = 1;
  7. @State pinchX: number = 0;
  8. @State pinchY: number = 0;
  9. build() {
  10. Column() {
  11. Column() {
  12. Text('PinchGesture scale:\n' + this.scaleValue)
  13. Text('PinchGesture center:\n(' + this.pinchX + ',' + this.pinchY + ')')
  14. }
  15. .height(200)
  16. .width(300)
  17. .border({ width: 3 })
  18. .margin({ top: 100 })
  19. // 在組件上綁定縮放比例,可以通過修改縮放比例來實現(xiàn)組件的縮小或者放大
  20. .scale({ x: this.scaleValue, y: this.scaleValue, z: 1 })
  21. .gesture(
  22. // 在組件上綁定三指觸發(fā)的捏合手勢
  23. PinchGesture({ fingers: 3 })
  24. .onActionStart((event: GestureEvent) => {
  25. console.info('Pinch start');
  26. })
  27. // 當(dāng)捏合手勢觸發(fā)時,可以通過回調(diào)函數(shù)獲取縮放比例,從而修改組件的縮放比例
  28. .onActionUpdate((event: GestureEvent) => {
  29. this.scaleValue = this.pinchValue * event.scale;
  30. this.pinchX = event.pinchCenterX;
  31. this.pinchY = event.pinchCenterY;
  32. })
  33. .onActionEnd(() => {
  34. this.pinchValue = this.scaleValue;
  35. console.info('Pinch end');
  36. })
  37. )
  38. }
  39. }
  40. }

旋轉(zhuǎn)手勢(RotationGesture)

  1. RotationGesture(value?:{fingers?:number; angle?:number})

旋轉(zhuǎn)手勢用于觸發(fā)旋轉(zhuǎn)手勢事件,觸發(fā)旋轉(zhuǎn)手勢的最少手指數(shù)量為2指,最大為5指,最小改變度數(shù)為1度,擁有兩個可選參數(shù):

  • fingers:非必選參數(shù),用于聲明觸發(fā)旋轉(zhuǎn)手勢所需要的最少手指數(shù)量,最小值為2,最大值為5,默認值為2。
  • angle:非必選參數(shù),用于聲明觸發(fā)旋轉(zhuǎn)手勢的最小改變度數(shù),單位為deg,默認值為1。

以在Text組件上綁定旋轉(zhuǎn)手勢實現(xiàn)組件的旋轉(zhuǎn)為例,可以通過在旋轉(zhuǎn)手勢的回調(diào)函數(shù)中獲取旋轉(zhuǎn)角度,從而實現(xiàn)組件的旋轉(zhuǎn):

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct Index {
  5. @State angle: number = 0;
  6. @State rotateValue: number = 0;
  7. build() {
  8. Column() {
  9. Text('RotationGesture angle:' + this.angle).fontSize(28)
  10. // 在組件上綁定旋轉(zhuǎn)布局,可以通過修改旋轉(zhuǎn)角度來實現(xiàn)組件的旋轉(zhuǎn)
  11. .rotate({ angle: this.angle })
  12. .gesture(
  13. RotationGesture()
  14. .onActionStart((event: GestureEvent) => {
  15. console.info('RotationGesture is onActionStart');
  16. })
  17. // 當(dāng)旋轉(zhuǎn)手勢生效時,通過旋轉(zhuǎn)手勢的回調(diào)函數(shù)獲取旋轉(zhuǎn)角度,從而修改組件的旋轉(zhuǎn)角度
  18. .onActionUpdate((event: GestureEvent) => {
  19. this.angle = this.rotateValue + event.angle;
  20. console.info('RotationGesture is onActionEnd');
  21. })
  22. // 當(dāng)旋轉(zhuǎn)結(jié)束抬手時,固定組件在旋轉(zhuǎn)結(jié)束時的角度
  23. .onActionEnd(() => {
  24. this.rotateValue = this.angle;
  25. console.info('RotationGesture is onActionEnd');
  26. })
  27. .onActionCancel(() => {
  28. console.info('RotationGesture is onActionCancel');
  29. })
  30. )
  31. }
  32. .height(200)
  33. .width(250)
  34. }
  35. }

滑動手勢(SwipeGesture)

  1. SwipeGesture(value?:{fingers?:number; direction?:SwipeDirection; speed?:number})

滑動手勢用于觸發(fā)滑動事件,當(dāng)滑動速度大于100vp/s時可以識別成功,擁有三個可選參數(shù):

  • fingers:非必選參數(shù),用于聲明觸發(fā)滑動手勢所需要的最少手指數(shù)量,最小值為1,最大值為10,默認值為1。
  • direction:非必選參數(shù),用于聲明觸發(fā)滑動手勢的方向,此枚舉值支持邏輯與(&)和邏輯或(|)運算。默認值為SwipeDirection.All。
  • speed:非必選參數(shù),用于聲明觸發(fā)滑動的最小滑動識別速度,單位為vp/s,默認值為100。

以在Column組件上綁定滑動手勢實現(xiàn)組件的旋轉(zhuǎn)為例:

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct Index {
  5. @State rotateAngle: number = 0;
  6. @State speed: number = 1;
  7. build() {
  8. Column() {
  9. Column() {
  10. Text("SwipeGesture speed\n" + this.speed)
  11. Text("SwipeGesture angle\n" + this.rotateAngle)
  12. }
  13. .border({ width: 3 })
  14. .width(300)
  15. .height(200)
  16. .margin(100)
  17. // 在Column組件上綁定旋轉(zhuǎn),通過滑動手勢的滑動速度和角度修改旋轉(zhuǎn)的角度
  18. .rotate({ angle: this.rotateAngle })
  19. .gesture(
  20. // 綁定滑動手勢且限制僅在豎直方向滑動時觸發(fā)
  21. SwipeGesture({ direction: SwipeDirection.Vertical })
  22. // 當(dāng)滑動手勢觸發(fā)時,獲取滑動的速度和角度,實現(xiàn)對組件的布局參數(shù)的修改
  23. .onAction((event: GestureEvent) => {
  24. this.speed = event.speed;
  25. this.rotateAngle = event.angle;
  26. })
  27. )
  28. }
  29. }
  30. }

說明

當(dāng)SwipeGesture和PanGesture同時綁定時,若二者是以默認方式或者互斥方式進行綁定時,會發(fā)生競爭。SwipeGesture的觸發(fā)條件為滑動速度達到100vp/s,PanGesture的觸發(fā)條件為滑動距離達到5vp,先達到觸發(fā)條件的手勢觸發(fā)??梢酝ㄟ^修改SwipeGesture和PanGesture的參數(shù)以達到不同的效果。

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號