鸿蒙开发-UI-动画-组件内转场动画

鸿蒙开发-UI-组件3

鸿蒙开发-UI-气泡/菜单

鸿蒙开发-UI-页面路由

鸿蒙开发-UI-组件导航-Navigation

鸿蒙开发-UI-组件导航-Tabs

鸿蒙开发-UI-图形-图片

鸿蒙开发-UI-图形-绘制几何图形

鸿蒙开发-UI-图形-绘制自定义图形

鸿蒙开发-UI-图形-页面内动画

文章目录

前言

一、基本概念

二、组件内转场动画

1.if/else产生组件内转场动画

2.ForEach产生组件内转场动画

总结


前言

上文细学习了鸿蒙开发UI使用动画相关知识,了解动画的两个维度的分类方式,详细学习了页面内动画-布局更新动画,本文将学习组件内转场动画。

一、基本概念

组件的插入、删除过程即为组件本身的转场过程,组件的插入、删除动画称为组件内转场动画,通过组件内转场动画定义组件出现、消失的效果。

组件内转场动画的接口

transition(value: TransitionOptions)

二、组件内转场动画

1.if/else产生组件内转场动画

代码示例

@Entry
@Component
struct IfElseTransition {
  @State flag: boolean = true;
  @State show: string = 'show';

  build() {
    Column() {
      Button(this.show).width(80).height(30).margin(30)
        .onClick(() => {
          if (this.flag) {
            this.show = 'hide';
          } else {
            this.show = 'show';
          }
//step2: 在animateTo闭包中改变flag的值,由flag变化所引起的Image组件的插入删除,都要按照动画参数产生动画         
          animateTo({ duration: 1000 }, () => {

            this.flag = !this.flag;
          })
        })
      if (this.flag) {
//step1:Image组件是由if控制的组件,给其加上transition的参数,以指定组件内转场的具体效果
//TransitionType.Insert【插入时加上平移效果】
//TransitionType.Delete【删除时加上缩放和透明度效果】

        Image($r('app.media.mountain')).width(200).height(200)
          .transition({ type: TransitionType.Insert, translate: { x: 200, y: -200 } })
          .transition({ type: TransitionType.Delete, opacity: 0, scale: { x: 0, y: 0 } })
      }
    }.height('100%').width('100%')
  }
}

注:transition必须配合animateTo一起使用,在animateTo的闭包中,控制组件的插入、删除并指定指定动画参数,transition定义动画样式

2.ForEach产生组件内转场动画

代码示例

@Entry
@Component
struct ForEachTransition {
  @State numbers: string[] = ["1", "2", "3", "4", "5"]
  startNumber: number = 6;

  build() {
    Column({ space: 10 }) {
      Column() {
        ForEach(this.numbers, (item) => {
//step1: ForEach下的直接组件需配置transition效果
          Text(item)
            .width(240)
            .height(60)
            .fontSize(18)
            .borderWidth(1)
            .backgroundColor(Color.Orange)
            .textAlign(TextAlign.Center)
            .transition({ type: TransitionType.All, translate: { x: 200 }, scale: { x: 0, y: 0 } })
        }, item => item)
      }
      .margin(10)
      .justifyContent(FlexAlign.Start)
      .alignItems(HorizontalAlign.Center)
      .width("90%")
      .height("70%")

      Button('向头部添加元素')
        .fontSize(16)
        .width(160)
        .onClick(() => {
          animateTo({ duration: 1000 }, () => {
//step2: 在animateTo的闭包中控制组件的插入或删除
//往numbers数组头部插入一个元素,导致ForEach在头部增Text组件
//部增Text组件按照transition定义的样式实现组件转场动画效果
            this.numbers.unshift(this.startNumber.toString());
            this.startNumber++;
          })
        })
     

    }
    .width('100%')
    .height('100%')
  }
}

注:Column布局方式设为了FlexAlign.Start,即垂直方向从头部开始布局。

1. 往数组末尾添加元素时,并不会对数组中现存元素对应的组件位置造成影响,只会触发新增组件的插入动画。

2. 往数组头部添加元素时,原来数组中的所有元素的下标都增加了,虽然不会触发其添加或者删除,但是会影响到对应组件的位置。所以除新增的组件会做transition动画以外,之前存在于ForEach中组件也会做位置动画。


总结

本文细学习了鸿蒙开发UI组件内转场动画,了解转场的概念,学习在if/else,foreach场景下如何结合transition和animateTo实现组件的转场动画效果,下文将学习弹簧曲线动画。

### 鸿蒙应用开发中的转场动画实现 在鸿蒙应用中实现转场动画主要依赖于ArkTS所提供的声明式开发范式。这使得开发者能够更加直观地定义页面间的过渡效果、组件内部的变化过程以及共享元素之间的平滑切换[^1]。 #### 页面间转场 对于页面间的转场,可以通过设置导航参数来指定进入新页面时所使用的动画类型。例如,在`router.push()`函数调用中加入特定选项: ```typescript this.$router.push({ name: 'DetailPage', params: { id }, transition: { appear: true, enterClass: "slide-in", leaveClass: "fade-out" } }); ``` 这里设置了当跳转至详情页(`DetailPage`)时采用滑动进入(`slide-in`)的效果,并且当前页面会逐渐消失(`fade-out`)。 #### 组件内转 为了给单个组件添加动态变化的能力,可以利用状态管理机制配合样式类名来进行控制。比如有一个按钮点击后改变颜色的过程: ```html <template> <div :class="['button', isActive ? 'active' : '']"></div> </template> <script lang="ts"> export default class MyComponent extends Vue { private isActive = false; public toggleActive() { this.isActive = !this.isActive; } } </script> <style scoped> .button.active { background-color: red; /* 动画结束后的样式 */ } @keyframes changeColor { from {background-color: blue;} to {background-color: red;} } .button { animation-name: changeColor; animation-duration: .5s; animation-fill-mode: forwards; } </style> ``` 上述代码片段展示了如何通过CSS动画结合Vue的状态更新逻辑达成视觉上的转换体验。 #### 共享元素转场 更复杂的景下可能涉及到多个界面中共有的UI部件同步移动或变形的情况。此时就需要借助框架提供的API如`SharedElementTransition`来协调不同容器内的相同控件之间的一致性表现形式。具体操作方式可参照官方文档说明[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值