核心API基础

1. 核心属性:customContentTransition

customContentTransition是Tabs组件用于自定义TabContent页面切换动画的核心属性,用于替换默认切换动画,实现完全自定义的转场效果。

customContentTransition(value: (from: number, to: number) => TabContentAnimatedTransition)
  • 参数:回调函数,入参from(切换前页面索引)、to(切换后页面索引)
  • 返回值TabContentAnimatedTransition自定义动画配置对象
  • 作用:完全接管Tabs页签切换的动画逻辑,支持透明度、缩放、位移等任意动画组合

2. 关键对象:TabContentAnimatedTransition

自定义动画的配置载体,包含两个核心配置项:

interface TabContentAnimatedTransition {
  timeout: number;        // 动画超时时间(ms)
  transition: (proxy: TabContentTransitionProxy) => void; // 自定义动画执行函数
}
  • timeout:动画最大执行时长,超时后自动结束
  • transition:动画核心逻辑,通过proxy.finishTransition()通知框架动画完成

3. 动画执行核心:animateTo

ArkTS内置动画函数,用于定义属性动画的时长、回调等:

animateTo(model: AnimateToParam, update: () => void)
  • model:动画参数(duration时长、onFinish完成回调等)
  • update:执行动画的UI属性变化逻辑

完整代码

// xxx.ets
// 定义Tab数据类型,包含文本和背景色
interface itemType {
  text: string,
  backgroundColor: Color
}

@Entry
@Component
struct TabsCustomAnimationExample {
  // Tab数据源
  @State data: itemType[] = [
    { text: 'Red', backgroundColor: Color.Red },
    { text: 'Yellow', backgroundColor: Color.Yellow },
    { text: 'Blue', backgroundColor: Color.Blue }];
  
  // 存储每个Tab的透明度动画状态
  @State opacityList: number[] = [];
  // 存储每个Tab的缩放动画状态
  @State scaleList: number[] = [];

  // 存储不同Tab的动画时长(递增)
  private durationList: number[] = [];
  // 存储不同Tab的动画超时时间(递增)
  private timeoutList: number[] = [];
  
  // 自定义切换动画核心函数
  private customContentTransition: (from: number, to: number) => TabContentAnimatedTransition = (from: number, to: number) => {
    let tabContentAnimatedTransition = {
      // 绑定对应索引的超时时间
      timeout: this.timeoutList[from],
      // 动画执行逻辑
      transition: (proxy: TabContentTransitionProxy) => {
        // 初始化:离开页面正常显示,进入页面缩小+半透明
        this.scaleList[from] = 1.0;
        this.scaleList[to] = 0.5;
        this.opacityList[from] = 1.0;
        this.opacityList[to] = 0.5;
        
        // 执行属性动画
        this.getUIContext()?.animateTo({
          // 绑定对应索引的动画时长
          duration: this.durationList[from],
          // 动画完成后通知框架结束转场
          onFinish: () => {
            proxy.finishTransition();
          }
        }, () => {
          // 动画目标状态:离开页面缩小+半透明,进入页面正常显示
          this.scaleList[from] = 0.5;
          this.scaleList[to] = 1.0;
          this.opacityList[from] = 0.5;
          this.opacityList[to] = 1.0;
        });
      }
    } as TabContentAnimatedTransition;
    return tabContentAnimatedTransition;
  };

  // 页面生命周期:初始化动画参数
  aboutToAppear(): void {
    let duration = 1000;
    let timeout = 1000;
    // 为每个Tab初始化动画状态和参数
    for (let i = 1; i <= this.data.length; i++) {
      this.opacityList.push(1.0);
      this.scaleList.push(1.0);
      this.durationList.push(duration * i);  // 1000、2000、3000ms递增
      this.timeoutList.push(timeout * i);   // 超时时间同步递增
    }
  }

  build() {
    Column() {
      // 循环渲染Tab页
      Tabs() {
        ForEach(this.data, (item: itemType, index: number) => {
          TabContent() {}
          .tabBar(item.text)                // 设置TabBar文本
          .backgroundColor(item.backgroundColor) // 设置页面背景色
          .opacity(this.opacityList[index])// 绑定动态透明度
          .scale({ x: this.scaleList[index], y: this.scaleList[index] }) // 绑定动态缩放
        })
      }
      .backgroundColor(0xf1f3f5)
      .width('100%')
      .height(500)
      // 绑定自定义切换动画
      .customContentTransition(this.customContentTransition)
    }
  }
}

运行效果说明:
当切换红色过程中:

切换完以后:

核心逻辑解析

  1. 数据与状态定义

    • itemType:统一Tab数据结构,规范文本与背景配置
    • opacityList/scaleList:响应式数组,存储每个Tab的动画属性,驱动UI更新
    • durationList/timeoutList:存储差异化动画参数,实现不同页签阶梯式动画
  2. 生命周期初始化
    aboutToAppear在页面渲染前执行,为所有Tab初始化默认样式(透明度1、缩放1),并生成递增的动画时长/超时时间。

  3. 自定义动画函数

    • 接收from/to索引,精准控制离开/进入页面
    • 初始化动画起始状态,通过animateTo执行属性过渡
    • 动画完成后调用proxy.finishTransition(),通知框架完成切换
  4. UI绑定动画
    TabContent通过opacityscale绑定响应式状态,动画执行时自动刷新UI样式。

动画效果说明

  1. 页面切换流程

    • 离开页面:缩放1→0.5,透明度1→0.5(缩小淡出)
    • 进入页面:缩放0.5→1,透明度0.5→1(放大淡入)
  2. 差异化动画时长

    • 第1个Tab切换:1000ms
    • 第2个Tab切换:2000ms
    • 第3个Tab切换:3000ms
      实现不同页签切换的动画节奏差异化。
  3. 动画稳定性
    通过timeout配置超时保护,避免动画异常导致页面卡住。

总结

  1. 核心APIcustomContentTransition 自定义Tabs切换动画,完全替代默认效果
  2. 核心对象TabContentAnimatedTransition 配置超时+动画逻辑
  3. 动画实现animateTo + 响应式状态,驱动透明度/缩放等UI属性变化
  4. 必备回调proxy.finishTransition() 通知框架动画完成
  5. 适用能力:支持透明度、缩放、平移、旋转等任意组合动画,满足个性化交互需求

如果这篇文章对你有帮助,欢迎点赞、收藏、关注,你的支持是持续创作的动力

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐