HarmonyOS 滑动事件冲突

我现在遇到一个滑动冲突的问题,父组件监听滑动手势做相应的操作,子组件中有一个scrollView,当父组件滑动到某个位置时,父组件通过position来定位位置,如果scrollView有展示不全的内容,scrollView 则滑动,如果都展示全,scrollView不滑动,我用了HitTestMode.Block HitTestMode.None 来控制scrollView 是否获得焦点,现在没有办法判断scrollView 是否展示全,只要给设置HitTestMode.Block 就能滑动 this.scrollerForScroll.isAtEnd() 这个只能判断scroll是否在结尾,请问还有其他api能监测 scroll是否显示全吗 还有如果子组件设置了HitTestMode.Block 那么他具有焦点,那么他的兄弟组件设置HitTestMode.Transparent,还能获取焦点,怎么能让 兄弟节点和父组件具有相同的焦点

HarmonyOS
2024-12-24 17:24:52
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
aquaa

可以参考以下demo,父组件 滑动完成后 子组件再滑动,目前用scrollController阻止scroll滚动

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  @State isBlock:boolean =false
  @State move:number =100
  scrollController: Scroller = new Scroller()
  scrollOffsetY: number = 0
  isScroll: boolean = false
  prevOffsetY: number = 0

  @State prevMoveY: number = this.move;

  aboutToAppear(): void {
    console.info("打印进入页面")
    let value2String = 'ddd'
    console.info("打印进入页面", value2String)

    // test2()
  }
  build() {
    Stack({alignContent:Alignment.Top}){
      Column() {
        Text(this.message).height(30)
        Scroll(this.scrollController) {
          Column() {
            Text("Scroll").height(400).backgroundColor(Color.Red)
            Text("Scroll").height(400)
            Text("Scroll").height(400)
            Text("Scroll").height(400)
            Text("Scroll").height(400)
            Text("Scroll").height(400)
            Text("Scroll").height(400)
            Text("Scroll").height(400)
            Text("Scroll").height(400)
            Text("Scroll").height(400)
            Text("Scroll").height(400)
            Text("Scroll").height(400)
          }

        }
        // .enableScrollInteraction(this.isBlock)
        // .onScroll((xOffset:number,yOffset:number)=>{
        // console.info("打印onScroll")
        // })
        .onScrollStart(()=>{
          if(!this.isScroll){
            this.scrollController.scrollTo({ xOffset: 0, yOffset: this.scrollOffsetY })
          }
        })
        .onDidScroll((event, y)=>{
          console.info(JSON.stringify(y), 'event')
          if(!this.isScroll){
            this.scrollController.scrollTo({ xOffset: 0, yOffset: this.scrollOffsetY })
          }
        })
        .width("100%")
        .height(600)
        .onTouch((event:TouchEvent)=>{
          console.info("打印onTouch")
          console.info("打印isBlock"+this.isBlock)
        })
        .nestedScroll({ scrollForward: NestedScrollMode.PARENT_FIRST, scrollBackward: NestedScrollMode.PARENT_FIRST })
      }
      .parallelGesture(
        PanGesture({ distance: 1 })
          .onActionStart((event: GestureEvent) => {
            // 初始化移动,这边移动的时候,可能滚动了一些内容,不知道是否需要,目前是这种情况,不知道是否需要对应处理,目前没有
            this.move = Math.max(-40, Math.min(event.offsetY+this.prevMoveY, 100))
            this.prevOffsetY = event.offsetY
            console.info("start", this.move, this.prevMoveY)
            this.isScroll = this.prevMoveY === this.move
            if(this.isScroll){
              // 记录滚动距离
              this.scrollOffsetY = this.scrollController.currentOffset().yOffset
            }
          })
          .onActionUpdate((event: GestureEvent) => {
            let oldMove = this.move
            // 这边可能会出现一种情况,可能移动超出了区间,之后下滑的时候,event.offsetY+this.prevMoveY还是会小于-40,此时会滚动scroll,不知道是否合适,如果不是这样的效果的话,可以在记录上次的移动距离,每次求差值
            this.move = Math.max(-40, Math.min(event.offsetY+this.prevMoveY, 100))
            // 这边就是说的相对移动距离
            // this.move = Math.max(-40, Math.min(event.offsetY - this.prevOffsetY + this.move, 100))
            // this.prevOffsetY = event.offsetY
            this.isScroll = oldMove === this.move
            if(this.isScroll){
              this.scrollOffsetY = this.scrollController.currentOffset().yOffset
            }

          }).onActionEnd(() => {
          console.info(this.move.toString(), 'this.move')
          this.prevMoveY = this.move
          this.scrollOffsetY = this.scrollController.currentOffset().yOffset
        })
      )
    }.position({top:this.move})
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
分享
微博
QQ
微信
回复
2024-12-24 19:47:45
相关问题
滑动嵌套事件冲突处理
1025浏览 • 0回复 待解决
HarmonyOS Scroll中嵌套List滑动事件冲突
816浏览 • 1回复 待解决
HarmonyOS 滑动冲突问题
1322浏览 • 1回复 待解决
HarmonyOS 父子组件滑动冲突
756浏览 • 1回复 待解决
HarmonyOS list嵌套MapComponent滑动冲突
593浏览 • 1回复 待解决
HarmonyOS Refresh组件嵌套滑动冲突问题
1920浏览 • 1回复 待解决
HarmonyOS List+Swipe+web滑动冲突
669浏览 • 1回复 待解决
HarmonyOS Tabs和横向Scroll滑动冲突
821浏览 • 1回复 待解决
HarmonyOS 触摸事件冲突问题
705浏览 • 1回复 待解决
HarmonyOS Marquee组件引起点击事件冲突
657浏览 • 1回复 待解决
Scroll内Flex加宽高与滑动冲突
2733浏览 • 1回复 待解决
事件分发冲突问题,如何解决?
1274浏览 • 1回复 待解决
HarmonyOS onToch事件滑动问题
634浏览 • 1回复 待解决