HarmonyOS 鸿蒙Next中转场动画可以在运行时被更改么?

HarmonyOS 鸿蒙Next中转场动画可以在运行时被更改么? 想实现如图所示的逻辑,感谢!

![图像]

代码改编自教程:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-enter-exit-transition

![图像]

4 回复

【背景知识】

transition是基础的组件转场接口,用于实现一个组件出现或者消失时的动画效果。可以通过transition对象的组合使用,定义出各式效果。

【解决方案】

  1. 初始化transitionEffect参数。
  2. 将转场效果通过transition接口设置到组件。
  3. 直接控制删除或者新增组件,动画参数由transitionEffect的animation接口配置。
  4. 给组件设置不同的转场动画。

完整的示例代码和效果如下:

import { curves } from '@kit.ArkUI';

@Entry
@Component
struct TransitionEffectDemo1 {
  @State isPresent: boolean = false;
  // 第一步,创建TransitionEffect
  private effect1: TransitionEffect =
    // 创建默认透明度转场效果,并指定了springMotion(0.6, 0.8)曲线
    TransitionEffect.OPACITY.animation({
      curve: curves.springMotion(0.6, 0.8)
    })// 通过combine方法,这里的动画参数会跟随上面的TransitionEffect,也就是springMotion(0.6, 0.8)
      .combine(TransitionEffect.scale({
        x: 0,
        y: 0
      }))// 添加旋转转场效果,这里的动画参数会跟随上面带animation的TransitionEffect,也就是springMotion(0.6, 0.8)
      .combine(TransitionEffect.rotate({ angle: -90 }))// 添加平移转场效果,这里的动画参数使用指定的springMotion()
      .combine(TransitionEffect.translate({ y: 150 })
        .animation({ curve: curves.springMotion() }))// 添加move转场效果,这里的动画参数会跟随上面的TransitionEffect,也就是springMotion()
      .combine(TransitionEffect.move(TransitionEdge.START));
  private effect2: TransitionEffect =
    // 创建默认透明度转场效果,并指定了springMotion(0.6, 0.8)曲线
    TransitionEffect.OPACITY.animation({
      curve: curves.springMotion(0.6, 0.8)
    })// 通过combine方法,这里的动画参数会跟随上面的TransitionEffect,也就是springMotion(0.6, 0.8)
      .combine(TransitionEffect.scale({
        x: 0,
        y: 0
      }))// 添加旋转转场效果,这里的动画参数会跟随上面带animation的TransitionEffect,也就是springMotion(0.6, 0.8)
      .combine(TransitionEffect.rotate({ angle: 90 }))// 添加平移转场效果,这里的动画参数使用指定的springMotion()
      .combine(TransitionEffect.translate({ y: 150 })
        .animation({ curve: curves.springMotion() }))// 添加move转场效果,这里的动画参数会跟随上面的TransitionEffect,也就是springMotion()
      .combine(TransitionEffect.move(TransitionEdge.END));
  effect: TransitionEffect|null = null;

  build() {
    Stack() {
      if (this.isPresent) {
        Column() {
          Text('ArkUI')
            .fontWeight(FontWeight.Bold)
            .fontSize(20)
            .fontColor(Color.White)
        }
        .justifyContent(FlexAlign.Center)
        .width(150)
        .height(150)
        .borderRadius(10)
        .backgroundColor(0xf56c6c)
        // 第二步:将转场效果通过transition接口设置到组件
        .transition(this.effect)
      }
      // 边框
      Column()
        .width(155)
        .height(155)
        .border({
          width: 5,
          radius: 10,
          color: Color.Black
        })
      // 第三步:新增或者删除组件触发转场,控制新增或者删除组件
      Column({space: 10}){
        Button('从左侧入场')
          .onClick(() => {
            this.effect = this.effect1
            this.isPresent = !this.isPresent;
          })
        Button('从右侧入场')
          .onClick(() => {
            this.effect = this.effect2
            this.isPresent = !this.isPresent;
          })
      }
      .margin({ top: 320 })
    }
    .width('100%')
    .height('60%')
  }
}

更多关于HarmonyOS 鸿蒙Next中转场动画可以在运行时被更改么?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


组件内的可以通过状态变量和条件渲染实现运行时动态变化。通过修改组件的状态结合 transition 属性和 TransitionEffect 对象,可以触发不同的转场效果。

struct MyComponent {

  @State showContent: boolean = true;

  @State effect: TransitionEffect = TransitionEffect.OPACITY;

  build() {

    Column() {

      if (this.showContent) {

        Text('动态内容')
          .transition(this.effect)
      }
      Button('切换动画')
        .onClick(() => {

          // 运行时修改转场效果
          this.effect = TransitionEffect.combine(
            TransitionEffect.rotate(90),
            TransitionEffect.scale({ x: 0.5, y: 0.5 })
          );
          this.showContent = !this.showContent;
        })
    }
  }
}

鸿蒙Next的转场动画支持运行时动态修改。开发者可以通过UIAbility的Window模块或ArkUI的转场动画API(如pageTransition)在应用运行期间调整动画参数。系统提供了修改动画类型、时长、曲线等属性的接口,这些变更会实时生效。转场动画的运行时控制能力是鸿蒙分布式能力的一部分,允许根据不同设备形态动态适配动画效果。

在HarmonyOS Next中,转场动画是可以在运行时动态修改的。通过使用ArkUI的状态管理和动画API,你可以实现动画参数的动态调整。

具体实现方式:

  1. 使用@State@Link装饰器定义控制动画的参数变量
  2. 将这些变量绑定到transition的动画参数上
  3. 在需要修改时更新这些状态变量

示例代码片段:

@Entry
@Component
struct TransitionExample {
  [@State](/user/State) scale: number = 1.0
  [@State](/user/State) opacity: number = 1.0

  build() {
    Column() {
      Button("Change Animation")
        .onClick(() => {
          // 运行时修改动画参数
          this.scale = Math.random() * 2
          this.opacity = Math.random()
        })

      // 应用动态转场参数
      Text("Dynamic Transition")
        .transition({ type: TransitionType.All, scale: { x: this.scale, y: this.scale }, opacity: this.opacity })
    }
  }
}

这种方式允许你在应用运行时根据需要调整转场动画的效果参数。

回到顶部