鸿蒙Scroll

217 阅读1分钟

第三章

Scroll组件(Scroll组件中只有子组件的布局尺寸超过Scroll组件的尺寸时才能发生滚动,Scroll只能有一个子组件)

3.1Scroll常用属性

.scrollable()(控制Scroll组件的滚动方向)
.scrollBar()(设置滚动条的状态)
.scrollBarColor()(设置滚动条的颜色)
.scrollBarWidth()(设置滚动条的宽度)
.edgeEffect()(设置滚动边缘)
@Entry
@Component
struct Practice {
  build() {
    Column() {
      Scroll() {
        Column() {
          Image($r('app.media.ic_jd_scroll_01'))
          Image($r('app.media.ic_jd_scroll_02'))
          Image($r('app.media.ic_jd_scroll_03'))
        }
      }
      .scrollBar(BarState.On)
      .scrollBarWidth(5)
      .scrollBarColor(Color.Black)
      .edgeEffect(EdgeEffect.Fade)
    }
    .height('100%')
    .width('100%')
  }
}

image.png

3.2Scroll的控制器

控制器的方法:
scrollEdge()(使页面滚动到边缘) currentOffset()(获取当前页面x,y的偏移量)
@Entry
@Component
struct Practice {
  scroller = new Scroller()

  build() {
    Column() {
      Scroll(this.scroller) {
        Column() {
          Image($r('app.media.ic_jd_scroll_01'))
          Image($r('app.media.ic_jd_scroll_02'))
          Image($r('app.media.ic_jd_scroll_03'))
        }
      }
      .scrollBar(BarState.On)
      .scrollBarWidth(5)
      .scrollBarColor(Color.Black)
      .edgeEffect(EdgeEffect.Fade)
      .onClick(() => {
        let x = this.scroller.currentOffset().xOffset
        let y = this.scroller.currentOffset().yOffset
        AlertDialog.show({ message: `x:${x},y:${y}` })
      })
    }
    .height('100%')
    .width('100%')
  }
}

image.png

3.3onScroll()/onWillScroll()(onScroll()Api小于12的时候,从Api12开始使用onWillScroll(),滚动回调返回滚动后的偏移量,可以以此设置一个回到顶部的判断。)

@Entry
@Component
struct Page {
  @State isActive: boolean = false
  scroller = new Scroller()

  build() {
    Column() {
      Stack({ alignContent: Alignment.BottomEnd }) {
        Scroll(this.scroller) {
          Column() {
            Image($r('app.media.ic_jd_scroll_01'))
            Image($r('app.media.ic_jd_scroll_02'))
            Image($r('app.media.ic_jd_scroll_03'))
          }
        }
        .onWillScroll(() => {
          if (this.scroller.currentOffset().yOffset >= 400) {
            this.isActive = true
          } else {
            this.isActive = false
          }
        })
        .scrollBar(BarState.Off)
        .edgeEffect(EdgeEffect.Fade)
        .height('100%')
        .width('100%')

        if (this.isActive) {
          Row({ space: 10 }) {
            Image($r('app.media.ic_jd_rocket'))
              .height(30)
              .width(30)
              .onClick(() => {
                this.scroller.scrollEdge(Edge.Top)
              })
          }
          .padding(5)
          .width(40)
          .height(40)
          .borderRadius(20)
          .backgroundColor(Color.White)
          .margin({ bottom: 90, right: 30 })
        }
      }
      .layoutWeight(1)

      Image($r('app.media.ic_jd_tab'))
        .width('100%')
    }
    .height('100%')
    .width('100%')
  }
}

image.png