skyline-route

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Skyline 自定义路由与页面转场

Skyline Custom Route and Page Transition

适用场景

Applicable Scenarios

  • 实现自定义页面转场动画(半屏、缩放、渐显等)
  • 使用预设路由快速实现常见转场效果
  • 配置页面返回手势(横向/纵向/多方向)
  • 实现卡片展开到详情页的容器转场动画
  • 通过 Router API 管理自定义路由
  • Implement custom page transition animations (half-screen, scaling, fade-in, etc.)
  • Quickly implement common transition effects using preset routes
  • Configure page back gestures (horizontal/vertical/multi-directional)
  • Implement container transition animation for card expansion to detail page
  • Manage custom routes through Router API

核心概念

Core Concepts

路由能力层级

Route Capability Levels

层级能力适用场景
预设路由一行代码使用 7 种内置效果快速实现常见转场
自定义路由通过 routeBuilder 完全控制动画高度定制化转场
容器转场
<open-container>
元素级过渡
卡片展开到详情页
LevelCapabilityApplicable Scenario
Preset RouteUse 7 built-in effects with one line of codeQuickly implement common transitions
Custom RouteFully control animations via routeBuilderHighly customized transitions
Container Transition
<open-container>
element-level transition
Card expansion to detail page

动画控制器

Animation Controller

属性说明
primaryAnimation页面进入/退出动画进度(0→1 进入,1→0 退出)
secondaryAnimation下一页进入时当前页动画进度(与下一页 primaryAnimation 同步)
userGestureInProgress当前路由进度是否由手势控制
startUserGesture / stopUserGesture手势接管/释放路由控制
didPop确认返回上一页
PropertyDescription
primaryAnimationPage entry/exit animation progress (0→1 for entry, 1→0 for exit)
secondaryAnimationAnimation progress of current page when the next page enters (synchronized with the primaryAnimation of the next page)
userGestureInProgressWhether the current routing progress is controlled by gesture
startUserGesture / stopUserGestureGesture takes over/releases routing control
didPopConfirm to return to the previous page

文档索引

Document Index

根据需求快速定位(路径相对于
references/
):
我想要...查阅文档
了解自定义路由原理和接口
custom-route/custom-route-guide.md
查看半屏/手势返回代码模式
custom-route/route-patterns.md
快速使用预设路由
preset-route/preset-route.md
配置页面返回手势
pop-gesture/pop-gesture.md
实现卡片展开转场
open-container/open-container.md
查看 Router API
api/router-api.md
了解 navigateTo 路由参数
api/navigate-to.md
监听路由事件
api/route-events.md
Quickly locate according to requirements (paths are relative to
references/
):
I want to...Refer to Document
Understand custom route principles and interfaces
custom-route/custom-route-guide.md
View half-screen/gesture back code patterns
custom-route/route-patterns.md
Quickly use preset routes
preset-route/preset-route.md
Configure page back gestures
pop-gesture/pop-gesture.md
Implement card expansion transition
open-container/open-container.md
View Router API
api/router-api.md
Understand navigateTo routing parameters
api/navigate-to.md
Listen to routing events
api/route-events.md

强制规则

Mandatory Rules

MUST(必须遵守)

MUST (Must Comply)

  1. 自定义路由仅在连续 Skyline 页面间生效:WebView 页面不支持自定义路由
    js
    // ✅ A 页(Skyline) → B 页(Skyline):自定义路由生效
    // ❌ A 页(WebView) → B 页(Skyline):降级为默认路由
  2. 动画处理函数必须声明 'worklet' 指令
    js
    // ✅ 正确
    const handlePrimaryAnimation = () => {
      'worklet'
      return { transform: `translateX(${...}px)` }
    }
    
    // ❌ 错误:缺少 worklet 指令,无法在 UI 线程执行
    const handlePrimaryAnimation = () => {
      return { transform: `translateX(${...}px)` }
    }
  3. 手势接管必须成对调用 startUserGesture / stopUserGesture
    js
    // ✅ 正确
    handleDragStart() {
      'worklet'
      this.customRouteContext.startUserGesture()
    }
    handleDragEnd() {
      'worklet'
      // ... 动画完成回调中:
      stopUserGesture()
    }
  4. 确认返回时必须调用 didPop:引擎无法自动判断开发者是否要退出页面
    js
    // ✅ 正确:动画完成后调用 didPop
    primaryAnimation.value = timing(0.0, { duration }, () => {
      'worklet'
      didPop()
      stopUserGesture()
    })
  5. navigator 组件在 Skyline 下只能嵌套文本节点
    html
    <!-- ✅ 正确 -->
    <navigator url="/page">点击跳转</navigator>
    
    <!-- ❌ 错误:不能嵌套 view 等普通节点 -->
    <navigator url="/page"><view>跳转</view></navigator>
  1. Custom routes only take effect between consecutive Skyline pages: WebView pages do not support custom routes
    js
    // ✅ Page A (Skyline) → Page B (Skyline): Custom route takes effect
    // ❌ Page A (WebView) → Page B (Skyline): Degrade to default route
  2. The animation processing function must declare the 'worklet' directive:
    js
    // ✅ Correct
    const handlePrimaryAnimation = () => {
      'worklet'
      return { transform: `translateX(${...}px)` }
    }
    
    // ❌ Incorrect: Missing worklet directive, cannot execute in UI thread
    const handlePrimaryAnimation = () => {
      return { transform: `translateX(${...}px)` }
    }
  3. Gesture takeover must call startUserGesture / stopUserGesture in pairs:
    js
    // ✅ Correct
    handleDragStart() {
      'worklet'
      this.customRouteContext.startUserGesture()
    }
    handleDragEnd() {
      'worklet'
      // ... In animation completion callback:
      stopUserGesture()
    }
  4. must call didPop when confirming return: The engine cannot automatically determine whether the developer wants to exit the page
    js
    // ✅ Correct: Call didPop after animation is completed
    primaryAnimation.value = timing(0.0, { duration }, () => {
      'worklet'
      didPop()
      stopUserGesture()
    })
  5. The navigator component can only nest text nodes under Skyline:
    html
    <!-- ✅ Correct -->
    <navigator url="/page">Click to jump</navigator>
    
    <!-- ❌ Incorrect: Cannot nest ordinary nodes such as view -->
    <navigator url="/page"><view>Jump</view></navigator>

NEVER(禁止行为)

NEVER (Prohibited Behaviors)

  1. NEVER 在手势处理中忘记调用
    startUserGesture
    就直接修改
    primaryAnimation.value
  2. NEVER 假设自定义路由在 WebView 页面生效(低版本基础库会降级)
  3. NEVER 在非 worklet 函数中访问
    primaryAnimation.value
  1. NEVER directly modify
    primaryAnimation.value
    in gesture processing without calling
    startUserGesture
  2. NEVER assume that custom routes take effect on WebView pages (lower version basic libraries will degrade)
  3. NEVER access
    primaryAnimation.value
    in non-worklet functions

Quick Reference

Quick Reference

预设路由速查

Preset Route Quick Check

routeType效果最低基础库
wx://bottom-sheet
底部弹出半屏3.1.0
wx://upwards
自底向上全屏3.1.0
wx://zoom
缩放进入3.1.0
wx://cupertino-modal
iOS 风格模态3.1.0
wx://cupertino-modal-inside
iOS 模态内嵌3.1.0
wx://modal-navigation
模态导航3.1.0
wx://modal
模态弹窗3.1.0
js
// 使用预设路由
wx.navigateTo({
  url: 'xxx',
  routeType: 'wx://bottom-sheet',
  routeOptions: { height: 60, round: true }
})
routeTypeEffectMinimum Basic Library Version
wx://bottom-sheet
Bottom pop-up half screen3.1.0
wx://upwards
Full screen from bottom to top3.1.0
wx://zoom
Zoom in3.1.0
wx://cupertino-modal
iOS style modal3.1.0
wx://cupertino-modal-inside
iOS modal embedded3.1.0
wx://modal-navigation
Modal navigation3.1.0
wx://modal
Modal popup3.1.0
js
// Use preset route
wx.navigateTo({
  url: 'xxx',
  routeType: 'wx://bottom-sheet',
  routeOptions: { height: 60, round: true }
})

API 速查

API Quick Check

API说明最低基础库
wx.router.addRouteBuilder(type, builder)
注册自定义路由2.29.2
wx.router.removeRouteBuilder(type)
移除自定义路由2.29.2
wx.router.getRouteContext(this)
获取路由上下文2.29.2
wx.navigateTo({ routeType })
指定路由类型跳转2.29.2
wx.navigateTo({ routeConfig })
覆盖路由配置3.4.0
wx.navigateTo({ routeOptions })
传入路由参数3.4.0
wx.navigateTo({ withOpenContainer })
容器转场跳转3.12.2
wx.onBeforeAppRoute(fn)
路由执行前监听3.5.5
wx.onAppRoute(fn)
路由执行后监听3.5.5
APIDescriptionMinimum Basic Library Version
wx.router.addRouteBuilder(type, builder)
Register custom route2.29.2
wx.router.removeRouteBuilder(type)
Remove custom route2.29.2
wx.router.getRouteContext(this)
Get routing context2.29.2
wx.navigateTo({ routeType })
Jump with specified route type2.29.2
wx.navigateTo({ routeConfig })
Override routing configuration3.4.0
wx.navigateTo({ routeOptions })
Pass routing parameters3.4.0
wx.navigateTo({ withOpenContainer })
Container transition jump3.12.2
wx.onBeforeAppRoute(fn)
Listen before routing execution3.5.5
wx.onAppRoute(fn)
Listen after routing execution3.5.5

自定义路由最小示例

Minimal Custom Route Example

js
// 注册:从右滑入
wx.router.addRouteBuilder('slide', ({ primaryAnimation }) => {
  const { windowWidth } = wx.getWindowInfo()
  const handlePrimaryAnimation = () => {
    'worklet'
    const transX = windowWidth * (1 - primaryAnimation.value)
    return { transform: `translateX(${transX}px)` }
  }
  return { handlePrimaryAnimation }
})

// 跳转
wx.navigateTo({ url: 'pageB', routeType: 'slide' })
js
// Register: Slide in from right
wx.router.addRouteBuilder('slide', ({ primaryAnimation }) => {
  const { windowWidth } = wx.getWindowInfo()
  const handlePrimaryAnimation = () => {
    'worklet'
    const transX = windowWidth * (1 - primaryAnimation.value)
    return { transform: `translateX(${transX}px)` }
  }
  return { handlePrimaryAnimation }
})

// Jump
wx.navigateTo({ url: 'pageB', routeType: 'slide' })

场景决策表

Scenario Decision Table

场景推荐方案
底部弹出半屏预设路由
wx://bottom-sheet
iOS 风格模态预设路由
wx://cupertino-modal
自定义半屏 + 手势自定义路由 + handlePrimaryAnimation
卡片展开到详情页
<open-container>
容器转场
页面渐显效果自定义路由 + opacity 动画
需要纵向返回手势
popGestureDirection: 'vertical'
ScenarioRecommended Solution
Bottom pop-up half screenPreset route
wx://bottom-sheet
iOS style modalPreset route
wx://cupertino-modal
Custom half screen + gestureCustom route + handlePrimaryAnimation
Card expansion to detail page
<open-container>
container transition
Page fade-in effectCustom route + opacity animation
Require vertical back gesture
popGestureDirection: 'vertical'

相关技能

Related Skills

场景推荐技能说明
动画开发
skyline-worklet
Worklet 动画系统(timing/spring/Easing)
手势处理
skyline-components
gesture-handler 手势组件
共享元素
skyline-components
share-element 页面间动画
配置详解
skyline-config
app.json/page.json 配置
概览迁移
skyline-overview
Skyline 概览与迁移指南
ScenarioRecommended SkillDescription
Animation development
skyline-worklet
Worklet animation system (timing/spring/Easing)
Gesture processing
skyline-components
gesture-handler gesture component
Shared element
skyline-components
share-element cross-page animation
Configuration explanation
skyline-config
app.json/page.json configuration
Overview migration
skyline-overview
Skyline overview and migration guide

References 目录结构

References Directory Structure

references/
├── api/
│   ├── navigate-to.md
│   ├── route-events.md
│   └── router-api.md
├── custom-route/
│   ├── custom-route-guide.md
│   └── route-patterns.md
├── open-container/
│   └── open-container.md
├── pop-gesture/
│   └── pop-gesture.md
└── preset-route/
    └── preset-route.md
references/
├── api/
│   ├── navigate-to.md
│   ├── route-events.md
│   └── router-api.md
├── custom-route/
│   ├── custom-route-guide.md
│   └── route-patterns.md
├── open-container/
│   └── open-container.md
├── pop-gesture/
│   └── pop-gesture.md
└── preset-route/
    └── preset-route.md