参考下面代码试一下enum ScrollPosition { start, center, end } @Entry @Component struct NestedScroll { @State listPosition: number = ScrollPosition.start; // 0代表滚动到List顶部,1代表中间值,2代表滚动到List底部。 @State scrollPosition: number = ScrollPosition.start; // 0代表滚动到页面顶部,1代表中间值,2代表滚动到页面底部。 @State showTitle: boolean = false; @State currentYOffset: number = 0; @State arr: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; private scrollerForScroll: Scroller = new Scroller(); private scrollerForList: Scroller = new Scroller(); controller: TextInputController = new TextInputController() @State index : number = 0 // private scroller: ListScroller = new ListScroller() @Builder BarComponent(indexSelf : number,str1:string){ Column(){ Text(str1) .fontWeight(FontWeight.Medium) .fontColor(this.index === indexSelf ? Color.Red : Color.Black) } } build() { Stack({ alignContent: Alignment.Top }) { Scroll(this.scrollerForScroll) { Column() { Column(){ } .width("100%") .height("10%") .backgroundColor(Color.Pink) Tabs({ barPosition: BarPosition.Start }) { TabContent() { List({ space: 10,scroller: this.scrollerForList }) { ForEach(this.arr, (item: number) => { ListItem() { Text("促销商品" + item) .width("100%") .height("100%") .borderRadius(15) .fontSize(24) .textAlign(TextAlign.Center) .backgroundColor(Color.White) }.width("100%").height(100) }, (item: string) => item) } .padding({ left: 10, right: 10 }) .width("100%") .edgeEffect(EdgeEffect.None) .scrollBar(BarState.Off) .onReachStart(() => { this.listPosition = ScrollPosition.start }) .onReachEnd(() => { this.listPosition = ScrollPosition.end }) .onScrollFrameBegin((offset: number, state: ScrollState) => { // 滑动到列表中间时 if (!((this.listPosition == ScrollPosition.start && offset < 0) || (this.listPosition == ScrollPosition.end && offset > 0))) { this.listPosition = ScrollPosition.center } // 如果页面已滚动到底部,列表不在顶部或列表有正向偏移量 if (this.scrollPosition == ScrollPosition.end && (this.listPosition != ScrollPosition.start || offset > 0)) { return { offsetRemain: offset }; } else { this.scrollerForScroll.scrollBy(0, offset) return { offsetRemain: 0 }; } }) }.tabBar('打折促销') //}.tabBar(this.BarComponent(0,'打折促销')) TabContent() { List({ space: 10, scroller: this.scrollerForScroll }) { ForEach(this.arr, (item: number) => { ListItem() { Text("行程安排" + item) .width("100%") .height("100%") .borderRadius(15) .fontSize(24) .textAlign(TextAlign.Center) .backgroundColor(Color.White) }.width("100%").height(100) }, (item: string) => item) } .padding({ left: 10, right: 10 }) .width("100%") .edgeEffect(EdgeEffect.None) .scrollBar(BarState.Off) .onReachStart(() => { this.listPosition = ScrollPosition.start }) .onReachEnd(() => { this.listPosition = ScrollPosition.end }) .onScrollFrameBegin((offset: number, state: ScrollState) => { // 滑动到列表中间时 if (!((this.listPosition == ScrollPosition.start && offset < 0) || (this.listPosition == ScrollPosition.end && offset > 0))) { this.listPosition = ScrollPosition.center } // 如果页面已滚动到底部,列表不在顶部或列表有正向偏移量 if (this.scrollPosition == ScrollPosition.end && (this.listPosition != ScrollPosition.start || offset > 0)) { return { offsetRemain: offset }; } else { this.scrollerForScroll.scrollBy(0, offset) return { offsetRemain: 0 }; } }) }.tabBar('行程服务') //}.tabBar(this.BarComponent(1,'行程服务')) } .onChange((index: number) => { this.index = index this.scrollerForList.scrollTo({xOffset:0,yOffset:0}) this.scrollerForScroll.scrollTo({xOffset:0,yOffset:0}) }) .vertical(false) .barMode(BarMode.Fixed) .barWidth(360) .barHeight(56) .width("100%") .height("92%") .backgroundColor('#F1F3F5') } } .scrollBar(BarState.Off) .width("100%") .height("100%") .onScroll((xOffset: number, yOffset: number) => { this.currentYOffset = this.scrollerForScroll.currentOffset().yOffset; // 非(页面在顶部或页面在底部),则页面在中间 if (!((this.scrollPosition == ScrollPosition.start && yOffset < 0) || (this.scrollPosition == ScrollPosition.end && yOffset > 0))) { this.scrollPosition = ScrollPosition.center } }) .onScrollEdge((side: Edge) => { if (side == Edge.Top) { // 页面在顶部 this.scrollPosition = ScrollPosition.start } else if (side == Edge.Bottom) { // 页面在底部 this.scrollPosition = ScrollPosition.end } }) .onScrollFrameBegin(offset => { if (this.scrollPosition == ScrollPosition.end) { return { offsetRemain: 0 }; } else { return { offsetRemain: offset }; } }) if (this.currentYOffset+50 >= 0) { Row() { TextInput({ text: 'xxxxxxxx', placeholder: 'input your word...', controller: this.controller }).fontSize(24) } .justifyContent(FlexAlign.Center) .backgroundColor('#00ffffff') .width('100%') .height('8%') } } .width('100%') .height('100%') .backgroundColor(0xDCDCDC) } }
参考下面代码试一下