HarmonyOS6 ArkTS Tabs 自定义Tabs页面切换动画
·
文章目录
核心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)
}
}
}
运行效果说明:
当切换红色过程中:
切换完以后:
核心逻辑解析
-
数据与状态定义
itemType:统一Tab数据结构,规范文本与背景配置opacityList/scaleList:响应式数组,存储每个Tab的动画属性,驱动UI更新durationList/timeoutList:存储差异化动画参数,实现不同页签阶梯式动画
-
生命周期初始化
aboutToAppear在页面渲染前执行,为所有Tab初始化默认样式(透明度1、缩放1),并生成递增的动画时长/超时时间。 -
自定义动画函数
- 接收
from/to索引,精准控制离开/进入页面 - 初始化动画起始状态,通过
animateTo执行属性过渡 - 动画完成后调用
proxy.finishTransition(),通知框架完成切换
- 接收
-
UI绑定动画
TabContent通过opacity和scale绑定响应式状态,动画执行时自动刷新UI样式。
动画效果说明
-
页面切换流程
- 离开页面:缩放1→0.5,透明度1→0.5(缩小淡出)
- 进入页面:缩放0.5→1,透明度0.5→1(放大淡入)
-
差异化动画时长
- 第1个Tab切换:1000ms
- 第2个Tab切换:2000ms
- 第3个Tab切换:3000ms
实现不同页签切换的动画节奏差异化。
-
动画稳定性
通过timeout配置超时保护,避免动画异常导致页面卡住。
总结
- 核心API:
customContentTransition自定义Tabs切换动画,完全替代默认效果 - 核心对象:
TabContentAnimatedTransition配置超时+动画逻辑 - 动画实现:
animateTo+ 响应式状态,驱动透明度/缩放等UI属性变化 - 必备回调:
proxy.finishTransition()通知框架动画完成 - 适用能力:支持透明度、缩放、平移、旋转等任意组合动画,满足个性化交互需求
如果这篇文章对你有帮助,欢迎点赞、收藏、关注,你的支持是持续创作的动力
更多推荐



所有评论(0)