HarmonyOS Scroll中嵌套一个自定义TabBar的Tabs,如何实现吸顶

HarmonyOS
1天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
fox280

参考示例:

1、index.ets

import { CustomListItem } from './CustomListItem';

@Entry
@Component
struct Index {
  private scrollerForScroll: Scroller = new Scroller();
  private scrollerForList: Scroller = new Scroller();
  @State fontColor: string = '#182431'
  @State selectedFontColor: string = '#007DFF'
  @State currentIndex: number = 0
  @State tabArray: Array<string> = ['关注', '推荐', '热榜', '投顾']
  @State focusIndex: number = 0
  private subsController: TabsController = new TabsController()

  //单独的页签
  @Builder
  Tab(tabName: string, tabIndex: number) {
    Row({ space: 20 }) {
      Text(tabName)
        .fontSize(tabIndex === this.focusIndex ? 21 : 18)
        .fontColor(tabIndex === this.focusIndex ? Color.Black : '#ffb7b7b7')
    }
    .justifyContent(FlexAlign.Center)
    .constraintSize({ minWidth: 35 })
    .width(60)
    .height(40)
    .borderRadius({ topLeft: 10, topRight: 10 })
    .onClick(() => {
      this.subsController.changeIndex(tabIndex)
      this.focusIndex = tabIndex
    })
  }

  build() {
    Column() {
      Column() {
        Scroll(this.scrollerForScroll) {
          Column() {
            Column() {
              Text("演示tabs的上层页面1")
            }
            .backgroundColor(Color.Orange)
            .height("170")
            .width('100%')

            Column() {
              Text("演示tabs的上层页面1")
            }
            .backgroundColor(Color.Green)
            .height("150")
            .width('100%')

            Column() {
              //tabBar
              Row({ space: 7 }) {
                Scroll() {
                  Row() {
                    ForEach(this.tabArray, (item: string, index: number) => {
                      this.Tab(item, index)
                    })
                  }
                  .justifyContent(FlexAlign.Start)
                }
                .align(Alignment.Start)
                .scrollable(ScrollDirection.Horizontal)
                .scrollBar(BarState.Off)
                .width('90%')
              }
              .alignItems(VerticalAlign.Bottom)
              .width('100%')

              // tabs
              Tabs({ barPosition: BarPosition.Start, controller: this.subsController }) {
                TabContent() {
                  List({ space: 10, scroller: this.scrollerForList }) {
                    //引入view
                    CustomListItem()

                    ListItem().height(28)
                  }
                  .padding({ left: 10, right: 10 })
                  .width('100%')
                  .height('100%')
                  .edgeEffect(EdgeEffect.None)
                  .scrollBar(BarState.Off)
                  //tabbar吸顶通过原生属性配合calc计算高度实现
                  .nestedScroll({
                    scrollForward: NestedScrollMode.PARENT_FIRST,
                    scrollBackward: NestedScrollMode.SELF_FIRST
                  })

                }.tabBar('关注')

                TabContent() {
                  Text('推荐')
                }.tabBar('推荐')
                .backgroundColor(Color.Yellow)


                TabContent() {
                  Text('热榜')
                }.tabBar('热榜')
                .backgroundColor(Color.Pink)

                TabContent() {
                  Text('投顾')
                }.tabBar('投顾')
                .backgroundColor(Color.Orange)

              }
              .width('100%')
              .height('100%')
              .barHeight(0)
              .animationDuration(100)
              .onChange((index: number) => {
                console.log('foo change')
                this.focusIndex = index
              })
            }
            //这一步很关键,控制吸顶距离
            .height('100%')
            .backgroundColor('#F1F3F5')

          }
        }
        .scrollBar(BarState.Off)
        .width('100%')
        .height('100%')

      }
      .width('100%')
      .height('100%')
      .backgroundColor(0xDCDCDC)
    }.width('100%')
  }
}

2、CustomListItem.ets

@Component
@Entry
export struct CustomListItem {
  @State schoolMajors: number[] | null =
    [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]

  build() {
    Column({ space: 30 }) {

      ForEach(this.schoolMajors, (item: number) => {
        Row() {
          Image($r("app.media.startIcon"))
            .width(60)
            .height(60)
            .margin({ right: 10 })

          Text("CustomListItem Test")
            .height(60)
            .margin({ right: 10 })
        }
        .margin({ left: 10 })
      }, (item: number) => item.toString() + Math.random())

    }
  }
}
分享
微博
QQ
微信
回复
1天前
相关问题
HarmonyOS一个自定义tabs冲突
43浏览 • 1回复 待解决
如何实现一个自定义询问框
444浏览 • 1回复 待解决
页面和列表嵌套滚动,实现列表
1302浏览 • 1回复 待解决
HarmonyOS 实现一个自定义分类列表
321浏览 • 1回复 待解决
如何实现一个自定义样式toast提示
2005浏览 • 1回复 待解决
tabs结合scroll实现顶效果
1495浏览 • 1回复 待解决
HarmonyOS 如何实现交互实现-
503浏览 • 1回复 待解决
如何在全局实现一个自定义dialog弹窗
2853浏览 • 1回复 待解决
如何实现分组列表/底效果
2267浏览 • 1回复 待解决
实现一个自定义动画,出现丢帧问题
417浏览 • 1回复 待解决
怎样实现一个自定义播放器?
381浏览 • 1回复 待解决
如何自定义函数创建一个UI组件
1842浏览 • 1回复 待解决
如何快速开发出一个自定义弹窗?
413浏览 • 1回复 待解决