HarmonyOS 鸿蒙Next中Tab切换问题

HarmonyOS 鸿蒙Next中Tab切换问题 点击Tab切换页签时,如何让Tab页签滚动到第二个位置

3 回复
import { componentUtils, curves, display } from '@kit.ArkUI';

@Component
struct ScrollSecondButton {
  @State indicatorIndex: number = 0
  @State displayInfo: display.Display | null = null
  private scroller: Scroller = new Scroller()
  private arr: string[] = ['全部内容', '体检', '老年体检', '中年体检', '视频', '老年体检', '新歌', '入职体检', '新片']

  aboutToAppear(): void {
    this.displayInfo = display.getDefaultDisplaySync(); //获取屏幕实例
  }

  // 获取组件大小、位置、平移缩放旋转及仿射矩阵属性信息。
  private getTextInfo(index: number): Record<string, number> {
    let modePosition: componentUtils.ComponentInfo =
      this.getUIContext().getComponentUtils().getRectangleById(index.toString());
    try {
      return { 'left': px2vp(modePosition.windowOffset.x), 'width': px2vp(modePosition.size.width) }
    } catch (error) {
      return { 'left': 0, 'width': 0 }
    }
  }

  private scrollIntoView(currentIndex: number): void {
    const currentOffsetX: number = this.scroller.currentOffset().xOffset //当前滚动的偏移量

    // 获取currentIndex 前两个按钮宽度
    if (currentIndex >= 1) {
      const PreviousOne = this.getTextInfo(currentIndex - 1)
      // 将按钮滚动到第二个按钮
      this.scroller.scrollTo({
        xOffset: currentOffsetX + PreviousOne.left,
        yOffset: 0,
        animation: {
          duration: 300,
          curve: curves.interpolatingSpring(7, 1, 328, 34)   // 动画曲线
        }
      })
    } else {
      this.scroller.scrollTo({
        xOffset: 0,
        yOffset: 0
      })
    }

  }

  build() {
    Column() {
      Scroll(this.scroller) {
        Row() {
          ForEach(this.arr, (item: string, index: number) => {
            Column() {
              Text(item)
                .fontSize(16)
                .borderRadius(5)
                .fontColor(this.indicatorIndex === index ? "#3ca4dc" : Color.Black)
                .fontWeight(FontWeight.Normal)
                .onClick(() => {
                  this.indicatorIndex = index
                  this.scrollIntoView(index)
                })
            }
            .padding({
              left: 12,
              right: 12,
              top: 8,
              bottom: 8
            })
            .margin({ left: 5, right: 5 })
            .borderRadius(20)
            .id(index.toString())
            .backgroundColor(this.indicatorIndex === index ? "#f1f9fe" : "#f7f7f7")
            .border({
              width: 1,
              color: this.indicatorIndex === index ? "#3ca4dc" : "#f7f7f7"
            })
          }, (item: string) => item)
        }
      }
      .width('100%')
      .height('100%')
      .scrollable(ScrollDirection.Horizontal)
      .scrollBar(BarState.Off)
      .edgeEffect(EdgeEffect.None)
    }
  }

更多关于HarmonyOS 鸿蒙Next中Tab切换问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,Tab切换可通过TabsTabContent组件实现。使用Tabs定义标签栏,TabContent定义对应内容区域。通过onChange事件监听切换动作,示例:

Tabs({ barPosition: BarPosition.Start }) {
  TabContent() {
    Text('内容1')
  }.tabBar('标签1')
  
  TabContent() {
    Text('内容2')
  }.tabBar('标签2')
}
.onChange((index: number) => {
  console.log(`切换到标签${index}`)
})

注意:确保TabsTabContent层级正确,否则可能导致渲染异常。

在HarmonyOS Next中实现Tab页签滚动到指定位置,可以通过Tab组件的scrollTo方法实现。以下是具体实现方案:

  1. 获取TabController对象:
private tabController: TabController = new TabController()
  1. 在Tab组件中绑定controller:
Tab({ barPosition: BarPosition.Start, controller: this.tabController }) {
  // Tab内容
}
  1. 在需要滚动到第二个Tab时调用:
this.tabController.scrollTo(1) // 索引从0开始,1表示第二个Tab
  1. 如果需要带动画效果:
this.tabController.scrollTo({
  index: 1,
  smooth: true // 启用平滑滚动
})

注意事项:

  • 确保TabBar有足够宽度支持滚动
  • 索引值不能超过Tab总数
  • 此方法适用于API version 9及以上版本

如需更精确控制,可以结合scrollBar属性进行额外配置。

回到顶部