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

相关推荐
贾伟康17 小时前
【HarmonyOS 7新能力|019】平行视界入门实战:从能力边界到最小可运行链路
harmonyos·arkts·arkui·harmonyos 7·平行视界
贾伟康19 小时前
【HarmonyOS 7新能力|030】沉浸光感工程封装:把接入逻辑放进可维护的分层结构
harmonyos·arkts·arkui·harmonyos 7·交互动效
熊猫钓鱼>_>2 天前
声临其境:HarmonyOS 空间音频全链路开发实战
音频·harmonyos·arkts·鸿蒙·arkui·空间·hap
熊猫钓鱼>_>2 天前
ArkTS 性能优化实战:从冷启动到长列表,一套可复现的实测方法论
app·harmonyos·arkts·鸿蒙·组件·性能·arkui
贾伟康2 天前
【HarmonyOS 7新能力|020】LazyLayoutAlgorithm入门实战:从能力边界到最小可运行链路
harmonyos·arkts·arkui·harmonyos 7·lazylayout
贾伟康4 天前
【口算王|02】HarmonyOS ArkTS 答题提交实战:防止重复提交并推进下一题
harmonyos·arkts·状态管理·arkui·幂等设计
贾伟康4 天前
【HarmonyOS 7新能力|008】互动卡片入门实战:从能力边界到最小可运行链路
harmonyos·arkts·arkui·harmonyos 7·互动卡片
贾伟康4 天前
【HarmonyOS 7新能力|005】沉浸光感入门实战:从能力边界到最小可运行链路
harmonyos·arkts·arkui·harmonyos 7·交互动效
贾伟康7 天前
【口算王|13】HarmonyOS ArkTS 应用启动链路实战:从 EntryAbility 到首屏加载保持窗口与路由稳定
harmonyos·arkts·arkui·应用启动·entryability
贾伟康10 天前
【句匠|16】HarmonyOS ArkTS 多设备布局实战:适配手机、平板和 PC/2in1 的窗口变化
harmonyos·arkts·arkui·响应式布局·多设备适配