鸿蒙OpenHarmony【手势拦截加强】ArkTS组件手势处置惩罚

打印 上一主题 下一主题

主题 878|帖子 878|积分 2634

shouldBuiltInRecognizerParallelWith

shouldBuiltInRecognizerParallelWith(callback: ShouldBuiltInRecognizerParallelWithCallback): T
提供体系内置手势与响应链上其他组件的手势设置并行关系的回调变乱。
元服务API:  从API version 12开始,该接口支持在元服务中利用。
体系能力:  SystemCapability.ArkUI.ArkUI.Full
参数:
参数名参数范例必填参数描述callback[ShouldBuiltInRecognizerParallelWithCallback]是提供体系内置手势与响应链上其他组件的手势设置并行关系的回调变乱,当该组件做触摸碰撞测试时,会触发用户界说的回调来形成手势并行关系。 返回值:
范例说明T返回当前组件。 ShouldBuiltInRecognizerParallelWithCallback

type ShouldBuiltInRecognizerParallelWithCallback = (current: GestureRecognizer, others: Array) => GestureRecognizer
提供体系内置手势与响应链上其他组件的手势设置并行关系的回调变乱范例。
元服务API:  从API version 12开始,该接口支持在元服务中利用。
体系能力:  SystemCapability.ArkUI.ArkUI.Full
参数:
参数名范例必填说明current[GestureRecognizer]是当前组件的体系内置手势识别器,当前版本只提供内置的[PAN_GESTURE]范例的手势识别器。othersArray<[GestureRecognizer]>是响应链上更高优先级的其他组件相同种别的手势识别器。 返回值:
范例说明[GestureRecognizer]与current识别器绑定并行关系的某个手势识别器。 GestureRecognizer

手势识别器对象。
getTag

getTag(): string
返回当前手势识别器的tag。
元服务API:  从API version 12开始,该接口支持在元服务中利用。
体系能力:  SystemCapability.ArkUI.ArkUI.Full
返回值:
范例说明string当前手势识别器的tag。 getType

getType(): GestureControl.GestureType
返回当前手势识别器的范例。
元服务API:  从API version 12开始,该接口支持在元服务中利用。
体系能力:  SystemCapability.ArkUI.ArkUI.Full
返回值:
范例说明[GestureControl.GestureType]当前手势识别器的范例。 isBuiltIn

isBuiltIn(): boolean
返回当前手势识别器是否为体系内置手势。
元服务API:  从API version 12开始,该接口支持在元服务中利用。
体系能力:  SystemCapability.ArkUI.ArkUI.Full
返回值:
范例说明boolean当前手势识别器是否为体系内置手势。 setEnabled

setEnabled(isEnabled: boolean): void
设置当前手势识别器的使能状态。
元服务API:  从API version 12开始,该接口支持在元服务中利用。
体系能力:  SystemCapability.ArkUI.ArkUI.Full
参数:
参数名范例必填说明isEnabledboolean是手势识别器的使能状态。 isEnabled

isEnabled(): boolean
返回当前手势识别器的使能状态。
元服务API:  从API version 12开始,该接口支持在元服务中利用。
体系能力:  SystemCapability.ArkUI.ArkUI.Full
返回值:
范例说明boolean当前手势识别器的使能状态。 getState

getState(): GestureRecognizerState
返回当前手势识别器的状态。
元服务API:  从API version 12开始,该接口支持在元服务中利用。
体系能力:  SystemCapability.ArkUI.ArkUI.Full
返回值:
范例说明[GestureRecognizerState]当前手势识别器的状态。 getEventTargetInfo

getEventTargetInfo(): EventTargetInfo
返回当前手势识别器对应组件的信息。
元服务API:  从API version 12开始,该接口支持在元服务中利用。
体系能力:  SystemCapability.ArkUI.ArkUI.Full
返回值:
范例说明[EventTargetInfo]当前手势识别器对应组件的信息。 isValid

isValid(): boolean;
返回当前手势识别器是否有效。
元服务API:  从API version 12开始,该接口支持在元服务中利用。
体系能力:  SystemCapability.ArkUI.ArkUI.Full
返回值:
范例说明boolean当前手势识别器是否有效。当该识别器绑定的组件被析构或者该识别器不在响应链上时返回false。 GestureRecognizerState

界说手势识别器状态。
元服务API:  从API version 12开始,该接口支持在元服务中利用。
体系能力:  SystemCapability.ArkUI.ArkUI.Full
名称值描述READY0预备状态。DETECTING1检测状态。PENDING2等待状态。BLOCKED3阻塞状态。SUCCESSFUL4成功状态。FAILED5失败状态。 EventTargetInfo

手势识别器对应组件的信息。
getId

getId(): string
返回当前组件的组件标识。
元服务API:  从API version 12开始,该接口支持在元服务中利用。
体系能力:  SystemCapability.ArkUI.ArkUI.Full
返回值:
范例说明string当前组件的[组件标识]。 ScrollableTargetInfo

手势识别器对应的滚动类容器组件的信息,继承于[EventTargetInfo]。
isBegin

isBegin(): boolean
返回当前滚动类容器组件是否在顶部,假如为Swiper组件且在循环模式下返回false。
元服务API:  从API version 12开始,该接口支持在元服务中利用。
体系能力:  SystemCapability.ArkUI.ArkUI.Full
返回值:
范例说明boolean当前滚动类容器组件是否在顶部。 isEnd

isEnd(): boolean
返回当前滚动类容器组件是否在底部,假如为Swiper组件且在循环模式下返回false。
元服务API:  从API version 12开始,该接口支持在元服务中利用。
体系能力:  SystemCapability.ArkUI.ArkUI.Full
返回值:
范例说明boolean当前滚动类容器组件是否在底部。 PanRecognizer

拖动手势识别器对象,继承于[GestureRecognizer]。
getPanGestureOptions

getPanGestureOptions(): PanGestureOptions
返回当前拖动手势识别器的属性。
元服务API:  从API version 12开始,该接口支持在元服务中利用。
体系能力:  SystemCapability.ArkUI.ArkUI.Full
返回值:
范例说明[PanGestureOptions]当前拖动手势识别器的属性。 onGestureRecognizerJudgeBegin

onGestureRecognizerJudgeBegin(callback: GestureRecognizerJudgeBeginCallback): T
给组件绑定自界说手势识别器判定回调。
元服务API:  从API version 12开始,该接口支持在元服务中利用。
体系能力:  SystemCapability.ArkUI.ArkUI.Full
参数:
参数名参数范例必填参数描述callback[GestureRecognizerJudgeBeginCallback]是给组件绑定自界说手势识别器判定回调,当绑定到该组件的手势被接受时,会触发用户界说的回调来获取结果。 返回值:
范例说明T返回当前组件。 GestureRecognizerJudgeBeginCallback

type GestureRecognizerJudgeBeginCallback = (event: BaseGestureEvent, current: GestureRecognizer, recognizers: Array) => GestureJudgeResult
自界说手势识别器判定回调范例。
元服务API:  从API version 12开始,该接口支持在元服务中利用。
体系能力:  SystemCapability.ArkUI.ArkUI.Full
参数:
参数名范例必填说明event[BaseGestureEvent]是当前根本手势变乱信息。current[GestureRecognizer]是当前即将要响应的识别器对象。othersArray<[GestureRecognizer]>是响应链上的其他手势识别器对象。 返回值:
范例说明[GestureJudgeResult]手势是否裁决成功的判定结果。 示例

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct FatherControlChild {
  5.   scroller: Scroller = new Scroller()
  6.   scroller2: Scroller = new Scroller()
  7.   private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  8.   private childRecognizer: GestureRecognizer = new GestureRecognizer()
  9.   private currentRecognizer: GestureRecognizer = new GestureRecognizer()
  10.   private lastOffset: number = 0
  11.   build() {
  12.     Stack({ alignContent: Alignment.TopStart }) {
  13.       Scroll(this.scroller) { // 外部滚动容器
  14.         Column() {
  15.           Text("Scroll Area")
  16.             .width('90%')
  17.             .height(150)
  18.             .backgroundColor(0xFFFFFF)
  19.             .borderRadius(15)
  20.             .fontSize(16)
  21.             .textAlign(TextAlign.Center)
  22.             .margin({ top: 10 })
  23.           Scroll(this.scroller2) { // 内部滚动容器
  24.             Column() {
  25.               Text("Scroll Area2")
  26.                 .width('90%')
  27.                 .height(150)
  28.                 .backgroundColor(0xFFFFFF)
  29.                 .borderRadius(15)
  30.                 .fontSize(16)
  31.                 .textAlign(TextAlign.Center)
  32.                 .margin({ top: 10 })
  33.               Column() {
  34.                 ForEach(this.arr, (item: number) => {
  35.                   Text(item.toString())
  36.                     .width('90%')
  37.                     .height(150)
  38.                     .backgroundColor(0xFFFFFF)
  39.                     .borderRadius(15)
  40.                     .fontSize(16)
  41.                     .textAlign(TextAlign.Center)
  42.                     .margin({ top: 10 })
  43.                 }, (item: string) => item)
  44.               }.width('100%')
  45.             }
  46.           }
  47.           .id("inner")
  48.           .width('100%')
  49.           .height(800)
  50.         }.width('100%')
  51.       }
  52.       .id("outer")
  53.       .height(600)
  54.       .scrollable(ScrollDirection.Vertical) // 滚动方向纵向
  55.       .scrollBar(BarState.On) // 滚动条常驻显示
  56.       .scrollBarColor(Color.Gray) // 滚动条颜色
  57.       .scrollBarWidth(10) // 滚动条宽度
  58.       .edgeEffect(EdgeEffect.None)
  59.       .shouldBuiltInRecognizerParallelWith((current: GestureRecognizer, others: Array<GestureRecognizer>) => {
  60.         for (let i = 0; i < others.length; i++) {
  61.           let target = others[i].getEventTargetInfo();
  62.           if (target) {
  63.             if (target.getId() == "inner" && others[i].isBuiltIn() && others[i].getType() == GestureControl.GestureType.PAN_GESTURE) { // 找到将要组成并行手势的识别器
  64.               this.currentRecognizer = current; // 保存当前组件的识别器
  65.               this.childRecognizer = others[i]; // 保存将要组成并行手势的识别器
  66.               return others[i]; // 返回将要组成并行手势的识别器
  67.             }
  68.           }
  69.         }
  70.         return undefined;
  71.       })
  72.       .onGestureRecognizerJudgeBegin((event: BaseGestureEvent, current: GestureRecognizer, others: Array<GestureRecognizer>) => { // 在识别器即将要成功时,根据当前组件状态,设置识别器使能状态
  73.         if (current) {
  74.           let target = current.getEventTargetInfo();
  75.           if (target) {
  76.             if (target.getId() == "outer" && current.isBuiltIn() && current.getType() == GestureControl.GestureType.PAN_GESTURE) {
  77.               if (others) {
  78.                 for (let i = 0; i < others.length; i++) {
  79.                   let target = others[i].getEventTargetInfo() as ScrollableTargetInfo;
  80.                   if (target instanceof ScrollableTargetInfo && target.getId() == "inner") { // 找到响应链上对应并行的识别器
  81.                     let panEvent = event as PanGestureEvent;
  82.                     if (target.isEnd()) { // 根据当前组件状态以及移动方向动态控制识别器使能状态
  83.                       if (panEvent && panEvent.offsetY < 0) {
  84.                         this.childRecognizer.setEnabled(false)
  85.                         this.currentRecognizer.setEnabled(true)
  86.                       } else {
  87.                         this.childRecognizer.setEnabled(true)
  88.                         this.currentRecognizer.setEnabled(false)
  89.                       }
  90.                     } else if (target.isBegin()) {
  91.                       if (panEvent.offsetY > 0) {
  92.                         this.childRecognizer.setEnabled(false)
  93.                         this.currentRecognizer.setEnabled(true)
  94.                       } else {
  95.                         this.childRecognizer.setEnabled(true)
  96.                         this.currentRecognizer.setEnabled(false)
  97.                       }
  98.                     } else {
  99.                       this.childRecognizer.setEnabled(true)
  100.                       this.currentRecognizer.setEnabled(false)
  101.                     }
  102.                   }
  103.                 }
  104.               }
  105.             }
  106.           }
  107.         }
  108.         return GestureJudgeResult.CONTINUE;
  109.       })
  110.       .parallelGesture( // 绑定一个Pan手势作为动态控制器
  111.         PanGesture()
  112.           .onActionUpdate((event: GestureEvent)=>{
  113.             if (this.childRecognizer.getState() != GestureRecognizerState.SUCCESSFUL || this.currentRecognizer.getState() != GestureRecognizerState.SUCCESSFUL) { // 如果识别器状态不是SUCCESSFUL,则不做控制
  114.               return;
  115.             }
  116.             let target = this.childRecognizer.getEventTargetInfo() as ScrollableTargetInfo;
  117.             let currentTarget = this.currentRecognizer.getEventTargetInfo() as ScrollableTargetInfo;
  118.             if (target instanceof ScrollableTargetInfo && currentTarget instanceof ScrollableTargetInfo) {
  119.               if (target.isEnd()) { // 在移动过程中实时根据当前组件状态,控制识别器的开闭状态
  120.                 if ((event.offsetY - this.lastOffset) < 0) {
  121.                   this.childRecognizer.setEnabled(false)
  122.                   if (currentTarget.isEnd()) {
  123.                     this.currentRecognizer.setEnabled(false)
  124.                   } else {
  125.                     this.currentRecognizer.setEnabled(true)
  126.                   }
  127.                 } else {
  128.                   this.childRecognizer.setEnabled(true)
  129.                   this.currentRecognizer.setEnabled(false)
  130.                 }
  131.               } else if (target.isBegin()) {
  132.                 if ((event.offsetY - this.lastOffset) > 0) {
  133.                   this.childRecognizer.setEnabled(false)
  134.                   if (currentTarget.isBegin()) {
  135.                     this.currentRecognizer.setEnabled(false)
  136.                   } else {
  137.                     this.currentRecognizer.setEnabled(true)
  138.                   }
  139.                 } else {
  140.                   this.childRecognizer.setEnabled(true)
  141.                   this.currentRecognizer.setEnabled(false)
  142.                 }
  143.               } else {
  144.                 this.childRecognizer.setEnabled(true)
  145.                 this.currentRecognizer.setEnabled(false)
  146.               }
  147.             }
  148.             this.lastOffset = event.offsetY
  149.           })
  150.       )
  151.     }.width('100%').height('100%').backgroundColor(0xDCDCDC)
  152.   }
  153. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

老婆出轨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表