HarmonyOS7 转场动画 Transition:页面切换更顺滑

文章目录

前言

你有没有注意过,好的 app 在页面之间切换、弹窗出现消失时,不是"啪"地硬切,而是有个淡入、滑入的过程?这种过渡就叫转场动画。

HarmonyOS 里做转场非常简单,核心就一个 .transition() 修饰符。这篇文章我把组件出现/消失、页面跳转两种转场都讲了,配代码你直接抄。

组件出现与消失的转场

最常见场景:点按钮,一个提示条从顶部滑下来;再点,它滑回去。关键是用状态控制组件"是否存在",再给它加转场。

代码实现

typescript 复制代码
@Local showTip: boolean = false

build() {
  Column() {
    Button('切换提示')
      .onClick(() => { this.showTip = !this.showTip })

    if (this.showTip) {
      Text('这是一条温馨提示')
        .fontSize(14)
        .backgroundColor('#FFF3CD')
        .padding(10)
        .transition(TransitionEffect.SLIDE)   // 滑入滑出
    }
  }
}

讲解:

  • if (this.showTip) 控制这个 Text 是否存在于组件树里。
  • .transition(TransitionEffect.SLIDE):当组件"出现"或"消失"时,自动播放滑入/滑出动画。

注意:transition 只对组件的插入和删除 生效。你用 if 控制存在性,它就天然有了转场时机。直接改 opacity 是不会触发 transition 的。

自定义转场方向与组合

TransitionEffect 还能组合多种效果,比如"淡入 + 从下方滑入":

核心代码

typescript 复制代码
.transition(
  TransitionEffect.OPACITY
    .combine(TransitionEffect.translate({ y: 30 }))
    .combine(TransitionEffect.scale({ x: 0.9, y: 0.9 }))
)
  • OPACITY:透明度过渡(淡入淡出)。
  • .translate({ y: 30 }):从下方 30vp 处滑入。
  • .scale(...):带一点缩放,显得更柔和。
  • .combine(...):把多个效果叠加,一次满足。

页面跳转转场

页面之间切换,用 Navigation 的转场,或在 push 时指定动画。简单起见,给目标页的 @Entry 组件加转场:

完整示例

typescript 复制代码
// 目标页面
@Entry
@ComponentV2
struct DetailPage {
  build() {
    Column() {
      Text('详情页').fontSize(24)
    }
    .width('100%')
    .height('100%')
    .transition(TransitionEffect.translate({ x: '100%' }).animation({ duration: 300 }))
  }
}

x: '100%' 表示"从右边整屏宽度的位置滑入",配合 300ms,就是经典的"新页面从右推入"效果。

转场不生效?排查清单

现象 原因 解决
完全没动画 没用 if 控制存在性 用 if/else 控制组件增删
只有淡入没滑动 只写了 OPACITY 用 .combine(translate)
动画卡顿 duration 太长或组合过多 精简效果,控制在 300ms 内

常见误区(小白必踩)

误区 说明
不用 if 控制组件存在性 transition 只对组件的"插入/删除"生效,直接改 opacity 不会触发转场。
只写 OPACITY 没滑动 想要滑入滑出,用 .combine(TransitionEffect.translate(...)) 叠加。
duration 太长 转场控制在 300ms 内,太长显得拖沓,体验反而差。

下面这段代码可以直接复制到 DevEco Studio 里运行。建议你边读边敲,改一改文末「动手改一改」里的参数,亲眼看看效果。

完整可运行示例:页面转场

用 transition 让组件出现/消失带过渡,而不是直接闪现。

代码解析

typescript 复制代码
// 配合 if 条件 + animateTo 触发 transition
@Entry
@Component
struct TransDemo {
  @State show: boolean = false

  build() {
    Column({ space: 20 }) {
      Button(this.show ? '隐藏' : '显示')
        .onClick(() => {
          animateTo({ duration: 300 }, () => { this.show = !this.show })
        })

      if (this.show) {
        Text('我带过渡出现了')
          .fontSize(22)
          .transition(TransitionEffect.OPACITY.animation({ duration: 300 }))
      }
    }
    .width('100%').height('100%')
    .justifyContent(FlexAlign.Center)
  }
}

你会看到什么:点按钮,文字以「淡入/淡出」的方式出现和消失,而不是硬切。

动手改一改:

  • 把 TransitionEffect.OPACITY 改成 TransitionEffect.SLIDE,文字改为从侧边滑入。
  • 给 Text 同时叠两个 transition:OPACITY.combine(TransitionEffect.SLIDE)。
  • 把 duration: 300 改大,看慢动作过渡。

写在最后

转场动画是"性价比最高"的体验优化------几行 .transition() 就能让 app 贵气不少。记住核心:用 if 控制存在性来触发转场,用 combine 叠加效果。

把你项目里所有"弹窗/提示的显隐"都加上 .transition(TransitionEffect.SLIDE),用户会明显觉得你的 app 更跟手、更顺。

相关推荐
大雷神12 小时前
HarmonyOS7应用《拼棋派对》实战:双人键盘操作与窗口焦点恢复
harmonyos·arkui·harmonyos 7.0·玩转 arkts
大雷神14 小时前
HarmonyOS7应用《拼棋派对》实战:折叠屏与电脑的窗口布局适配
harmonyos·arkui·harmonyos 7.0·玩转 arkts
大雷神16 小时前
HarmonyOS7应用《拼棋派对》实战:深浅主题、控件对比度与统一样式
harmonyos·arkui·harmonyos 7.0·玩转 arkts
大雷神18 小时前
HarmonyOS7应用《拼棋派对》实战:模拟器回归验证与签名打包
harmonyos·arkui·harmonyos 7.0·玩转 arkts
贾伟康19 小时前
【共创稿事节】@Link双向绑定的适用边界
性能优化·实战·harmonyos·arkts·arkui
贾伟康19 小时前
【共创稿事节】布局审查工具与边界调试
harmonyos·arkui·inspector·性能排查·布局调试
贾伟康2 天前
【健康菜谱助手|08】HarmonyOS ArkTS 食材百科实战:实现分类、检索和详情跳转
软件测试·移动开发·harmonyos·arkts·arkui
贾伟康2 天前
【共创稿事节】WaterFlow瀑布流的列宽策略
性能优化·实战·harmonyos·arkts·arkui
贾伟康6 天前
【健康菜谱助手|06】HarmonyOS ArkTS 烹饪计时器实战:处理倒计时、暂停、恢复和到期反馈
软件测试·移动开发·harmonyos·arkts·arkui
贾伟康6 天前
【健康菜谱助手|05】HarmonyOS ArkTS 购物清单实战:去重食材并同步勾选、数量与清空动作
软件测试·移动开发·harmonyos·arkts·arkui