IT评测·应用市场-qidao123.com

标题: 鸿蒙手势交互(四:多层手势) [打印本页]

作者: 郭卫东    时间: 2024-9-21 04:40
标题: 鸿蒙手势交互(四:多层手势)

四、多层手势

指父子组件嵌套时,父子组件均绑定了手势或事件。有两种,一种默认多层级手势事件,一种自定义多层级手势事件。

  1. //组件B和组件C作为组件A的子组件,当触摸到组件B或者组件C时,组件A也会被触摸到。
  2. ComponentA() {
  3.     ComponentB().onTouch(() => {})
  4.     ComponentC().onTouch(() => {})
  5. }.onTouch(() => {})
  6. //组件B和组件C作为Stack A的子组件,组件C覆盖在组件B上。当触摸到组件B或者组件C时,Stack A也会被触摸到。(组件B被组件C遮盖)
  7. Stack A() {
  8.     ComponentB().onTouch(() => {})
  9.     ComponentC().onTouch(() => {})
  10. }.onTouch(() => {})
复制代码


  1. // 当绑定了responseRegion后,手势与事件的响应区域范围将以所绑定的区域范围为准,而不是以布局区域为准,可能出现布局相关区域不响应手势与事件的情况
  2. ComponentA() {
  3.         // 当组件B绑定了.responseRegion({Rect1, Rect2, Rect3})的属性后,
  4.         // 所有落在Rect1,Rect2和Rect3区域范围的触摸事件和手势可被组件B对应的回调响应。
  5.     ComponentB()
  6.     .onTouch(() => {})
  7.     .gesture(TapGesture({count: 1}))
  8.     .responseRegion({Rect1, Rect2, Rect3})
  9. }
  10. .onTouch(() => {})
  11. // 当组件A绑定了.responseRegion({Rect4})的属性后,
  12. // 所有落在Rect4区域范围的触摸事件和手势可被组件A对应的回调响应。
  13. .gesture(TapGesture({count: 1}))
  14. .responseRegion({Rect4})
复制代码

  1. // hitTestBehavior属性可以实现在复杂的多层级场景下,一些组件能够响应手势和事件,而一些组件不能响应手势和事件
  2. ComponentA() {
  3.     ComponentB()
  4.     .onTouch(() => {})
  5.     .gesture(TapGesture({count: 1}))
  6.     ComponentC() {
  7.         ComponentD()
  8.         .onTouch(() => {})
  9.         .gesture(TapGesture({count: 1}))
  10.     }
  11.     .onTouch(() => {})
  12.     .gesture(TapGesture({count: 1}))
  13.     .hitTestBehavior(HitTestMode.Block)
  14. }
  15. .onTouch(() => {})
  16. .gesture(TapGesture({count: 1}))
  17. // HitTestMode.Block自身会响应触摸测试,阻塞子节点和兄弟节点的触摸测试,从而导致子节点和兄弟节点的onTouch事件和手势均无法触发。
  18. // 当组件C未设置hitTestBehavior时,点击组件D区域,组件A、组件C和组件D的onTouch事件会触发,组件D的点击手势会触发。
  19. // 当组件C设置了hitTestBehavior为HitTestMode.Block时,点击组件D区域,组件A和组件C的onTouch事件会触发,组件D的onTouch事件未触发。同时,由于组件D的点击手势因为被阻塞而无法触发,组件C的点击手势会触发。
复制代码
  1. Stack A() {
  2.     ComponentB()
  3.     .onTouch(() => {})
  4.     .gesture(TapGesture({count: 1}))
  5.     ComponentC()
  6.     .onTouch(() => {})
  7.     .gesture(TapGesture({count: 1}))
  8.     .hitTestBehavior(HitTestMode.Transparent)
  9. }
  10. .onTouch(() => {})
  11. .gesture(TapGesture({count: 1}))
  12. // HitTestMode.Transparent自身响应触摸测试,不会阻塞兄弟节点的触摸测试。
  13. // 当组件C未设置hitTestBehavior时,点击组件B和组件C的重叠区域时,Stack A和组件C的onTouch事件会触发,组件C的点击事件会触发,组件B的onTouch事件和点击手势均不触发。
  14. // 而当组件C设置hitTestBehavior为HitTestMode.Transparent时,点击组件B和组件C的重叠区域,组件A和组件C不受到影响与之前一致,组件A和组件C的onTouch事件会触发,组件C的点击手势会触发。而组件B因为组件C设置了HitTestMode.Transparent,组件B也收到了Touch事件,从而组件B的onTouch事件和点击手势触发。
复制代码

  1. // 父子组件所绑定手势类型相同时,子组件优先于父组件响应
  2. ComponentA() {
  3.     ComponentB()
  4.     .gesture(TapGesture({count: 1}))
  5. }
  6. .gesture(TapGesture({count: 1}))
复制代码
  1. // 以带优先级的方式绑定手势,则可使得父组件所绑定手势的响应优先级高于子组件
  2. ComponentA() {
  3.     ComponentB()
  4.     .gesture(TapGesture({count: 1}))
  5. }
  6. .priorityGesture(TapGesture({count: 1}))
复制代码
  1. // 使用并行的方式在父组件绑定手势,父子组件所绑定的手势不发生冲突,均可响应
  2. ComponentA() {
  3.     ComponentB()
  4.     .gesture(TapGesture({count: 1}))
  5. }
  6. .parallelGesture(TapGesture({count: 1}))
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4