HarmonyOS 鸿蒙Next 有没有方法可以从代码层主动触发WaterFlow的滚动呢

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

HarmonyOS 鸿蒙Next 有没有方法可以从代码层主动触发WaterFlow的滚动呢
有没有方法可以从代码层主动触发WaterFlow的滚动呢,比如点击一个按钮后,将WaterFlow滚动到对应位置这种逻辑

5 回复

WaterFlow组件可以绑定scroller控制器,可以使用scroller控制器的方法触发WaterFlow的滚动。

  • 滑动到指定位置:scrollTo(value: { xOffset: number | string, yOffset: number | string, animation?: ScrollAnimationOptions | boolean })
  • 滑动到指定Index:scrollToIndex(value: number, smooth?: boolean, align?: ScrollAlign, options?: ScrollToIndexOptions)

参考以下demo:

//  WaterFlowDataSource公共类可使用官网示例中的:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-container-waterflow-V5#示例1使用基本瀑布流

import { WaterFlowDataSource } from '../common/WaterFlowDataSource'

@Entry
@Component
struct WaterFlowDemo {
  @State minSize: number = 80
  @State maxSize: number = 180
  @State fontSize: number = 24
  @State colors: number[] = [0xFFC0CB, 0xDA70D6, 0x6B8E23, 0x6A5ACD, 0x00FFFF, 0x00FF7F]
  scroller: Scroller = new Scroller()
  dataSource: WaterFlowDataSource = new WaterFlowDataSource()
  private itemWidthArray: number[] = []
  private itemHeightArray: number[] = []

  // 计算FlowItem宽/高
  getSize() {
    let ret = Math.floor(Math.random() * this.maxSize)
    return (ret > this.minSize ? ret : this.minSize)
  }

  // 设置FlowItem的宽/高数组
  setItemSizeArray() {
    for (let i = 0; i < 100; i++) {
      this.itemWidthArray.push(this.getSize())
      this.itemHeightArray.push(this.getSize())
    }
  }

  aboutToAppear() {
    this.setItemSizeArray()
  }

  onPageShow(): void {
    // 页面显示后,自动滚动到第十条数据。
    this.scroller.scrollToIndex(10);
  }

  @Builder
  itemFoot() {
    Column() {
      Text(`Footer`)
        .fontSize(10)
        .backgroundColor(Color.Red)
        .width(50)
        .height(50)
        .align(Alignment.Center)
        .margin({ top: 2 })
    }
  }

  build() {
    Column({ space: 2 }) {
      WaterFlow({ scroller: this.scroller }) {
        LazyForEach(this.dataSource, (item: number) => {
          FlowItem() {
            Column() {
              Text("N" + item).fontSize(12).height('16')
              // 存在对应的jpg文件才会显示图片
              Image('res/waterFlowTest(' + item % 5 + ').jpg')
                .objectFit(ImageFit.Fill)
                .width('100%')
                .layoutWeight(1)
            }
          }
          .onAppear(() => {
            // 即将触底时提前增加数据
            if (item + 20 == this.dataSource.totalCount()) {
              for (let i = 0; i < 100; i++) {
                this.dataSource.addLastItem()
              }
            }
          })
          .width('100%')
          .height(this.itemHeightArray[item % 100])
          .backgroundColor(this.colors[item % 5])
        }, (item: string) => item)
      }
      .columnsTemplate("1fr 1fr")
      .columnsGap(10)
      .rowsGap(5)
      .backgroundColor(0xFAEEE0)
      .width('100%')
      .height('100%')
      .onReachStart(() => {
        console.info('waterFlow reach start')
      })
      .onScrollStart(() => {
        console.info('waterFlow scroll start')
      })
      .onScrollStop(() => {
        console.info('waterFlow scroll stop')
      })
      .onScrollFrameBegin((offset: number, state: ScrollState) => {
        console.info('waterFlow scrollFrameBegin offset: ' + offset + ' state: ' + state.toString())
        return { offsetRemain: offset }
      })
    }
  }
}

更多关于HarmonyOS 鸿蒙Next 有没有方法可以从代码层主动触发WaterFlow的滚动呢的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


好的,谢谢,我试试,

图片

用定时setTimeout ?

怎么实现呢,

图片

在HarmonyOS 鸿蒙Next系统中,从代码层主动触发WaterFlow(即瀑布流布局)的滚动,通常可以通过操作对应的滚动视图组件来实现。鸿蒙系统提供了丰富的UI组件和API来控制界面行为,包括滚动视图。

要实现这一功能,你可以使用鸿蒙的组件开发框架,特别是ScrollView或类似支持滚动的容器组件。具体操作可能涉及设置滚动位置或触发滚动事件。以下是一个简化的步骤描述:

  1. 获取滚动视图组件的引用:首先,确保你的布局文件中包含了ScrollView或相应的滚动容器,并在代码中获取该组件的引用。

  2. 设置滚动位置:使用鸿蒙提供的API来设置滚动视图的位置,例如通过scrollTosmoothScrollTo方法,这些方法允许你指定滚动到的目标位置。

  3. 触发滚动:调用上述方法即可从代码层触发滚动行为。

请注意,具体实现细节可能依赖于你使用的鸿蒙SDK版本和具体的组件库。如果上述方法无法直接应用,可能需要查阅最新的鸿蒙开发文档或示例代码。

如果问题依旧没法解决请联系官网客服,官网地址是

回到顶部