-
绑定手势的方式
- 通过gesture、priorityGesture(优先识别该手势)、parallelGesture(并行手势)为组件直接绑定。
- 通过自定义动态属性(给组件设置gestureModifier,然后自定义GestureModifier接口,进行添加和删除首饰),给UIGestureEvent对象调用其接口添加和删除手势。addGesture(添加手势)、addParallelGesture(添加并行手势)、removeGestureByTag(删除手势)、clearGestures(清除手势)。
- 自定义添加手势额外相关类:TapGestureHandler(点击手势处理器)、LongPressGestureHandler(长按手势处理器)、PanGestureHandler(滑动手势处理器)等,跟方法1直接绑定是一一对应的。tag方法:给处理器设置标志。
-
基础手势分类(直接给组件绑定即可)
- TapGesture:支持单击、双击、多次点击事件。count:设置连续点击次数,默认1;fingers:设置点击手指数。
- LongPressGesture:长按手势事件,默认最短长按时间500毫秒。duration:控制最短长按时长。
- PanGesture:滑动手势,当滑动的最小距离达到设定的最小值时触发滑动手势事件。direction:指定触发滑动手势事件的方向;distance:指定触发滑动手势事件的最小滑动距离。
- PinchGesture:捏和手势事件,最少需要2指,最多5指,最小识别距离5vp。fingers:触发最小手指数,默认2;distance:触发最小识别距离,默认5,单位vp。
- RotationGesture:旋转手势,最少2指,最多5指,最小改变度数为1度。fingers:触发最小手指数;angle:触发最小角度变化,默认1,单位deg。
- SwiperGesture:快滑手势,滑动速度需大于速度阈值,默认最小速度为100vp/s。fingers:触发快滑最小手指数,默认1;direction:触发快滑手势的滑动方向。speed:识别快滑的最小速度,默认100vp/s。
-
组合手势
- 两种及以上手势组合为复合手势,支持顺序识别、并发识别、互斥识别。mode:设置组合手势识别模式,顺序、并发、互斥;gesture:设置一个或多个手势类型,可以设置各种基础手势。
-
手势拦截控制
-
onGestureJudgeBegin:为组件绑定自定义手势判定回调。当手势即将成功时,触发用户自定义的回调获取结果。
- 场景:当组合手势时,可以通过获取手势类型,控制特定手势根据特定条件拦截与否。
-
shouldBuiltInRecognizerParallelWith:当组件进行触摸测试时,会触发该回调,提供系统内置手势与响应链上其他组件的手势设置并行关系的回调事件。简单来说就是参数返回当前手势的识别器以及其它手势的识别器,找到与当前需要并行的识别器,比如两个scroll嵌套,参数current是外层scroll,参数others是内层所有组件,找到内层scroll,然后将两个scroll的识别器保存成局部变量,供后面设置父滚动还是子滚动,通过识别器设置enable。注意该回调需要返回值,返回需要并行处理的识别器。
-
onGestureRecognizerJudgeBegin:手势识别器即将要成功时,意思就是在shouldBuiltInRecognizerParallelWith这个回调之后回调给我们使用,这个回调主要作用可以判定当前手势是否拦截;还可以做一些前置处理,如嵌套滚动冲突,在这里也做一次前置滚动判定,如果只在滑动并行手势里面做的话,会导致颤动。event:当前基础手势事件信息;current:当前即将要响应的识别器对象;recognizers:响应链上的其他手势识别器对象;touchRecognizers:响应链上的Touch识别器对象。默认值为null,表示在当前手势绑定组件及其子孙组件没有可响应的Touch识别器。如果有的话,可以精准控制子组件touch事件是否响应,通过cancelTouch。
-
onTouchTestDone:触摸测试结束后,指定手势识别器是否参与后续处理,关键拦截方法preventBegin。
- 适用场景:动态阻止系统手势与自定义滑动手势冲突;嵌套滚动中控制子组件手势优先级;屏蔽某些手势等。
-
-
手势冲突总结:
- 单纯要拦截组件:外部拦截内部使用hitTestMode;内部拦截外部子组件可以在onTouchIntercept这个事件里面拦截父;父组件还可以通过onChildTouchTest这个方法在触摸测试阶段对子组件触摸进行策略分配。
- 单纯拦截手势:onGestureJudgeBegin通过获取手势type来判断是否拦截。
- 滑动冲突:
-
onTouchTestDone:触发时机用户触摸按下时,系统收集完所有手势对象后触发,作用阶段手势识别开始前,核心能力阻止手势参与识别,控制粒度控制整个手势识别器是否生效。
- 在触摸事件分发初期彻底禁用某些手势,调用
gestureRecognizer.preventBegin()阻止识别器生效,避免不可逆的竞争冲突。
- 在触摸事件分发初期彻底禁用某些手势,调用
-
onGestureRecognizerJudgeBegin:触发时机手势满足系统触发阈值时触发,作用阶段手势即将被系统判定成功时(裁决阶段),核心能力动态裁决是否拦截手势,控制粒度精细控制单个手势的成功或失败状态。
- 根据动态条件(如位置、速度、距离、滑动方向等)决定是否拦截手势(如嵌套tabs滑动到边缘时放行父组件手势、嵌套滑动列表、多级滑动衔接等),通过返回值GestureJudgeResult.REJECT或CONTINUE裁决手势。
-
鸿蒙手势处理篇(滑动冲突、基础手势、组合手势)
积水成渊,蛟龙生焉2026-04-23 21:46
相关推荐
纯爱掌门人7 小时前
聊聊 HarmonyOS 上的应用内通知授权弹窗不喝水就会渴9 小时前
从基础到实战:鸿蒙 ArkUI 属性动画开发指南南村群童欺我老无力.10 小时前
鸿蒙 - TextInput高度设置的边界行为仓颉编程语言12 小时前
直播预告 |【仓颉社区】第44期WORKSHOP南村群童欺我老无力.13 小时前
鸿蒙PC开发的Slider组件blockSize参数的类型要求C雨后彩虹13 小时前
文件目录大小前端技术13 小时前
华为余承东:鸿蒙终端设备数突破5500万Lanren的编程日记13 小时前
Flutter 鸿蒙应用启动速度优化实战:优先级并行初始化+懒加载,全方位提升启动体验Lanren的编程日记14 小时前
Flutter 鸿蒙应用权限管理功能实战:标准化权限申请与状态管控,提升用户信任度