鸿蒙应用开发小例-自动隐藏的菜单

本文介绍了如何使用JavaScript定时器和UI组件的animation属性,实现在用户不操作时自动隐藏并点击时弹出的底部菜单效果。作者提供了详细的代码示例,包括状态管理、定时器控制和动画过渡的实现过程。
摘要由CSDN通过智能技术生成

实现效果

底部菜单是很常见的页面组成部分。需要实现的效果是,在一定时间内没有操作时隐藏菜单,点击界面时呼出菜单。

自动隐藏菜单示例

实现思路

菜单组件显示在屏幕底部,通过定时器修改状态,使其offset属性y轴位置变化。

点击界面时,修改状态,使其offset属性y轴位置回到默认位置。

为菜单组件增加animation属性。

如有更好的思路,请说出你的想法,一起讨论之~

基本结构

示例页面包含,内容区域(Content)和菜单(MenuBar)。

菜单组件中包含三个按钮。

代码实现

constants下定义了一些通用的数值和颜色,请自行替换。

主要结构

外层使用了Flex组件,对于本示例无特殊意义,也可以换成其他容器组件。

通过改变contentMaskButtonToggle状态,触发菜单位置变化。注意,需要加上@State装饰器。

@State contentMaskButtonToggle: boolean = false
controlTimer = null

build() {
    // ...
    Flex({
        direction: FlexDirection.Column,
        justifyContent: FlexAlign.SpaceBetween,
        alignItems: ItemAlign.Center
    }) {
        Content()
        MenuBar()
    }.onClick(() => {
        this.contentMaskButtonToggle = true
        clearTimeout(this.controlTimer)
        // 此处使用的constants.CONTROL_HIDE_TIME,值为5000
        this.controlTimer = setTimeout(() => {
            this.contentMaskButtonToggle = false
        }, constants.CONTROL_HIDE_TIME)
    })
    // ...
}

NavbarContent组件不做介绍,主要来看看菜单MenuBar组件。

菜单组件

使用@Builder装饰器自定义构建函数,UI结构上采用了Flex组件包裹Button组件的方式。

修改状态contentMaskButtonToggle,触发offset属性y轴数值改变,实现显示或隐藏菜单的效果。

通过animation属性的设置,实现过渡效果。

@Builder function MenuBar () {
  Flex({ direction: FlexDirection.Row, wrap: FlexWrap.NoWrap }) {
    Button({ type: ButtonType.Normal }) { ... }
    Button({ type: ButtonType.Normal }) { ... }
    Button({ type: ButtonType.Normal }) { ... }
  }
  .width('100%').height(constants.UI.MENU_HEIGHT)
  .offset({ x: 0, y: this.contentMaskButtonToggle ? 0 : constants.UI.MENU_HEIGHT })
  .animation({
    duration: 300,
    curve: Curve.Linear,
    iterations: 1
  })
}

以上就是这个小例的核心思路和示例代码。

完结散花

如发现文章内容有任何问题,请提出您的宝贵意见予以指正,感谢您的阅读。

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值