HarmonyOS 鸿蒙Next 底部能跟随上方List的指示器不知该怎么做?

发布于 1周前 作者 eggper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 底部能跟随上方List的指示器不知该怎么做? 底部能跟随上方List的指示器不知该怎么做?是否有相关控件或代码

2 回复

参考:https://gitee.com/harmonyos-cases/cases/blob/master/CommonAppDevelopment/feature/swipersmoothvariation/README.md

示例代码:

@Entry
@Component
struct Index {
  @State list: number[] = []
  @State currentIndex: number = 0
  @State containerHeight: number = 0
  @State containerWidth: number = 0
  @State containerMaxHeight: number = 0
  @State containerMinHeight: number = 0
  @State pageSize: number = 0
  @State lastPageLines: number = 1
  private listScroller: ListScroller = new ListScroller()
  aboutToAppear(): void {
    this.list = new Array(24).fill(0)
    // 计算总页数和最后一页应该有的行数, 15-一页总数,5-单行列数
    this.pageSize = Math.ceil(this.list.length / 15)
    this.lastPageLines = Math.ceil(this.list.length % 15 / 5) || 3
  }
  updateContainerHeight(x: number) {
    let offsetX = this.listScroller.currentOffset().xOffset + x - this.containerWidth * (this.pageSize - 2)
    if (offsetX > 0) {
      let h = offsetX / this.containerWidth * (this.containerMaxHeight - this.containerMinHeight)
      // 根据横向偏移距离等比计算高度变化
      this.containerHeight = this.containerMaxHeight - h
    } else {
      this.containerHeight = this.containerMaxHeight
    }
  }
  build() {
    Column() {
      Scroll() {
        List({ scroller: this.listScroller }) {
          ForEach(new Array(this.pageSize).fill(0), (item: number, index: number) => {
            ListItem() {
              List({ space: 10 }) {
                ForEach(this.list.slice(index * 15, (index + 1) * 15), (item: number) => {
                  ListItem() {
                    Column() {
                      Image($r('app.media.app_icon'))
                        .width('100%')
                      Text('xxx')
                    }
                  }
                })
              }
              .lanes(5, 10)
              .padding({ left: 10, right: 10 })
              .edgeEffect(EdgeEffect.None)
              .scrollBar(BarState.Off)
            }
            .width('100%')
          })
        }
        .scrollBar(BarState.Off)
        .listDirection(Axis.Horizontal)
        .scrollSnapAlign(ScrollSnapAlign.START)
        .friction(1)
        .edgeEffect(EdgeEffect.None)
        .onAreaChange((_, n) => {
          if (!this.containerWidth) {
            this.containerWidth = Number(n.width)
            this.containerHeight = Number(n.height)
            this.containerMaxHeight = this.containerHeight
            // 最后一页高度即为最小高度 // 20-行间距 3-行数
            this.containerMinHeight =
              (this.containerHeight - 20) / 3 * this.lastPageLines + 10 * (this.lastPageLines - 1)
          }
        })
        .onWillScroll((x) => {
          this.updateContainerHeight(x)
        })
        .onScrollIndex((start, end) => {
          if (start === end) {
            this.currentIndex = start
          }
        })
        .lanes(1)
      }
      .height(this.containerHeight || 'auto')
      Row({ space: 4 }) {
        ForEach(new Array(this.pageSize).fill(0), (_, index: number) => {
          Circle()
            .width(6)
            .height(6)
            .fill(this.currentIndex === index ? '#f00' : '#ccc')
            .onClick(() => {
              this.listScroller.scrollToIndex(index, true)
              this.currentIndex = index
            })
        })
      }
      .margin(10)
      Column() {
        Text('占位')
      }
      .width('100%')
      .layoutWeight(1)
      .backgroundColor('#ff0000')
    }
    .width('100%')
    .height('100%')
  }
}

更多关于HarmonyOS 鸿蒙Next 底部能跟随上方List的指示器不知该怎么做?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中,若要实现底部指示器跟随上方List滚动的功能,通常需要利用鸿蒙系统的组件特性和事件监听机制。以下是一个简要的实现思路:

  1. 组件布局:首先,确保你的布局文件中包含一个可滚动的List组件(如ListContainer或自定义的滚动视图)以及一个底部的指示器组件(如ScrollBarDotsIndicator或自定义指示器)。

  2. 滚动事件监听:为List组件添加滚动事件监听器。在监听器中,根据List的滚动位置动态调整底部指示器的状态。例如,如果List滚动了某个特定距离,就更新指示器当前选中的项。

  3. 指示器更新:根据监听到的滚动位置,计算并更新底部指示器的当前选中项。这通常涉及到修改指示器的显示内容或样式,以反映List的当前滚动状态。

  4. 同步动画(可选):为了提供更好的用户体验,可以在指示器更新时添加平滑过渡动画,使指示器的变化与List的滚动更加协调。

请注意,具体实现细节可能因鸿蒙系统版本、开发工具和项目需求而有所不同。如果上述方法无法直接解决你的问题,可能是因为某些特定场景或配置需要额外的处理。

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部