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 更跟手、更顺。

相关推荐
大师兄66683 小时前
HarmonyOS7 单元测试:从 @Test 到覆盖率
单元测试·覆盖率·harmonyos7
高地捣蛋鬼7 小时前
HarmonyOS7 表单验证实战:实时校验与错误提示的完整方案
arkts·arkui·harmonyos7
大师兄66681 天前
HarmonyOS7 状态驱动 UI 原理:为什么改了数据视图就变
ui·arkui·实战案例·harmonyos7
不才难以繁此生2 天前
HarmonyOS 图片列表滑动卡顿怎么办:中式美食菜谱封面怎么做占位、缓存和失败兜底
harmonyos·image·arkui·中式美食·列表性能
大师兄66682 天前
HarmonyOS7 长列表性能优化:渲染与内存双提升
性能优化·长列表·harmonyos7
大师兄66682 天前
HarmonyOS7 分布式流转:手机到平板无缝接续案例
分布式·跨设备·harmonyos7·分布式流转
不才难以繁此生2 天前
ArkUI Tabs 切换后状态丢失怎么办:中式美食分类页怎么保留关键词、筛选和滚动位置
harmonyos·状态管理·arkui·tabs·中式美食
大师兄66683 天前
HarmonyOS7 音视频播放:AVPlayer 实战
音视频·avplayer·harmonyos7
风华圆舞3 天前
鸿蒙上跑通第一个 AI Agent:5 分钟接入智谱/DeepSeek
人工智能·华为·harmonyos·arkts·arkui·toolregistry