鸿蒙笔记--Scroll

        这一节了解一下Scroll控件,在鸿蒙(HarmonyOS)开发中,Scroll控件是一个重要的可滚动容器组件,它允许在子组件的布局尺寸超过父组件尺寸时提供滚动功能。

scrollable
含义:控制Scroll组件的滚动方向。
可选值:
ScrollDirection.Vertical:垂直滚动(默认值)。
ScrollDirection.Horizontal:水平滚动。

scrollBar:
含义:设置滚动条的状态。
可选值:
BarState.Auto:自动显示滚动条(默认值)。
BarState.On:始终显示滚动条。
BarState.Off:始终不显示滚动条。

scrollBarColor
含义:设置滚动条的颜色。
scrollBarWidth:
含义:设置滚动条的宽度。
edgeEffect
含义:设置滚动边缘的效果。
可选值:
EdgeEffect.None:无效果。
EdgeEffect.Spring:弹簧效果。
EdgeEffect.Fade:阴影效果。

enableScrollInteraction(API 10+):
含义:设置是否支持滚动手势。
可选值:
true:支持滚动手势(默认值)。
false:不支持滚动手势,但不影响通过控制器接口进行的滚动。
friction(API 10+):
含义:设置滚动时的摩擦力,影响滚动的速度和惯性。

栗子:

@Entry @Component struct ArkUITest {

  build() {
    Scroll() {
      Text('Text1')
        .fontSize(26)
        .size({width: 180, height: 40}) // 子组件的高度小于Scroll高度,不会触发滚动
        .backgroundColor('#aabbcc')
    }
    .width('100%')
    .height(100)
    .backgroundColor(Color.Pink)
  }
}
@Entry @Component struct ArkUITest {
  build() {
    Scroll() {// Scroll没有设置滚动方向,默认竖直方向滚动
      Column() {
        Text('Text1')
          .fontSize(26)
          .size({width: 180, height: 90})
          .backgroundColor('#aabbcc')
        Text('Text2')
          .fontSize(26)
          .size({width: 180, height: 90})
          .backgroundColor('#bbccaa')
        Text('Text3')
          .fontSize(26)
          .size({width: 180, height: 90})
          .backgroundColor('#ccaabb')
        Text('Text4')
          .fontSize(26)
          .size({width: 180, height: 90})
          .backgroundColor('#abcabc')
      }
      .width('100%')
    }
    .width(230)
    .height(200)
    .backgroundColor(Color.Pink)
  }
}

控制器:
可以通过创建Scroller的实例并将其绑定给Scroll组件来控制滚动。
控制器提供了多种方法来控制滚动,如scrollTo(滚动到指定位置)、scrollEdge(滚动到容器边缘)、scrollPage(滚动到下一页或上一页)等。
滚动事件:
onScroll(API小于12时使用):滚动事件回调,返回滚动时水平、竖直方向偏移量。
onWillScroll(API 12及以上时使用):滚动回调,返回滚动后的偏移量。

栗子:

@Entry
@Component
struct ScrollWithController {
    scroller: Scroller = new Scroller();
    @State isActive: boolean = false;
 
    build() {
        Column() {
            Scroll(this.scroller) {
                Column() {
                    // 放置多个子组件
                    Text('Text1')
            .fontSize(26)
            .size({width: 180, height: 120})
            .backgroundColor('#aabbcc')
          Text('Text2')
            .fontSize(26)
            .size({width: 180, height: 120})
            .backgroundColor('#bbccaa')
          Text('Text3')
            .fontSize(26)
            .size({width: 180, height: 120})
            .backgroundColor('#ccaabb')
          Text('Text4')
            .fontSize(26)
            .size({width: 180, height: 120})
            .backgroundColor('#abcabc')
          Text('Text5')
            .fontSize(26)
            .size({width: 180, height: 120})
            .backgroundColor('#abcabc')
          Text('Text6')
            .fontSize(26)
            .size({width: 180, height: 120})
            .backgroundColor('#abcabc')
          Text('Text7')
            .fontSize(26)
            .size({width: 180, height: 120})
            .backgroundColor('#abcabc')
          Text('Text8')
            .fontSize(26)
            .size({width: 180, height: 120})
            .backgroundColor('#aabbcc')
          Text('Text9')
            .fontSize(26)
            .size({width: 180, height: 120})
            .backgroundColor('#bbccaa')
          Text('Text10')
            .fontSize(26)
            .size({width: 180, height: 120})
            .backgroundColor('#ccaabb')
                }
            }
            .scrollBar(BarState.On)
            .scrollBarWidth(5)
            .scrollBarColor(Color.Black)
            .edgeEffect(EdgeEffect.Fade)
            .onWillScroll(() => {
                const yOffset = this.scroller.currentOffset().yOffset;
                if (yOffset >= 400) {
                    this.isActive = true;
                } else {
                    this.isActive = false;
                }
            })
            .width('100%')
            .height('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 });
            }
        }
    }
}

分析:这个示例中,我们创建了一个Scroll组件,并通过控制器来控制滚动。同时,我们还使用了onWillScroll事件来监听滚动偏移量,并根据偏移量来显示或隐藏一个返回顶部的按钮。当用户点击返回顶部按钮时,控制器会将Scroll组件滚动到顶部。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值