鸿蒙开发中BindSheet应用 打造半模态转场效果

在鸿蒙开发中,BindSheet 组件可用于创建半模态窗口,通过设置合适的属性和添加动画效果,能够实现具有转场效果的半模态窗口。以下是详细的实现步骤和示例代码。

实现思路

  1. 布局设计:使用 BindSheet 组件创建半模态窗口,并设置其内容布局。
  2. 显示与隐藏控制:通过状态变量控制 BindSheet 的显示与隐藏。
  3. 转场动画添加:利用 Animator 组件为 BindSheet 添加转场动画效果,使其在显示和隐藏时具有平滑的过渡。

示例代码

@Entry
@Component
struct BindSheetExample {
  // 控制 BindSheet 显示与隐藏的状态变量
  private isBindSheetVisible: boolean = false
  // 动画播放控制器
  private animatorController: AnimatorController = new AnimatorController()

  build() {
    Stack({ alignContent: Alignment.Center }) {
      // 触发打开 BindSheet 的按钮
      Button('打开半模态窗口')
       .onClick(() => {
          // 点击按钮时,显示 BindSheet
          this.isBindSheetVisible = true
          // 播放显示动画
          this.animatorController.play()
        })

      if (this.isBindSheetVisible) {
        BindSheet({
          // 当 BindSheet 关闭时,更新状态变量
          onDismiss: () => {
            this.isBindSheetVisible = false
          }
        }) {
          Column({ space: 20 }) {
            // BindSheet 内的文本内容
            Text('这是半模态窗口的内容')
             .fontSize(20)
            // 关闭 BindSheet 的按钮
            Button('关闭窗口')
             .onClick(() => {
                // 点击关闭按钮时,隐藏 BindSheet
                this.isBindSheetVisible = false
              })
          }
         .width('100%')
         .padding({ left: 20, top: 20, right: 20, bottom: 20 })
         .backgroundColor('#FFFFFF') // 内容区域的背景颜色为白色
        }
       .backgroundColor('#00000080') // 设置 BindSheet 的背景为半透明黑色
       .position({ x: 0, y: 0 })
       .width('100%')
       .height('auto')
       .opacity(0) // 初始透明度为 0
       .translate({ x: 0, y: 100 }) // 初始位置向下偏移 100 像素
       .animate({
          duration: 300, // 动画时长为 300 毫秒
          curve: Curve.EaseOut // 动画曲线为 EaseOut
        }) {
          this.animatorController = new AnimatorController({
            // 显示动画:透明度变为 1,位置恢复正常
            play: () => {
              this.opacity = 1
              this.translate = { x: 0, y: 0 }
            },
            // 隐藏动画:透明度变为 0,位置向下偏移 100 像素
            reverse: () => {
              this.opacity = 0
              this.translate = { x: 0, y: 100 }
            }
          })
        }
      }
    }
   .width('100%')
   .height('100%')
  }
}

代码解释

  1. 状态管理:使用 isBindSheetVisible 状态变量控制 BindSheet 的显示与隐藏。当点击“打开半模态窗口”按钮时,将 isBindSheetVisible 设置为 true,并播放显示动画;点击“关闭窗口”按钮时,将 isBindSheetVisible 设置为 false
  2. BindSheet 组件:创建半模态窗口,设置其背景颜色为半透明黑色,内容区域为白色。
  3. 转场动画
    • 初始时,设置 BindSheet 的透明度为 0,位置向下偏移 100 像素。
    • 使用 animate 方法添加动画效果,动画时长为 300 毫秒,动画曲线为 EaseOut
    • 通过 AnimatorController 控制动画的播放和反转,实现显示和隐藏时的平滑过渡。

注意事项

  • 动画效果的具体参数(如时长、偏移量、动画曲线等)可以根据实际需求进行调整。
  • 确保在 onDismiss 回调中正确更新 isBindSheetVisible 状态变量,以避免出现显示异常的问题。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357

推荐阅读更多精彩内容