我的技术栈是Kotlin/Compose 原生

Kotlin/Compose 原生的话,路线挺清晰的,多邻国那套感觉完全可以做出来。 先说动画层。Compose 的 animation API 已经够用,关键是用对组合方式: AnimatedContent 做内容切换,配 transitionSpec 自己定义 enter/exit,别用默认的 fade+scale。 animateFloatAsState / Animatable 做数值驱动,Animatable 更适合需要打断和跟手的场景。 updateTransition 把多个属性绑到同一个状态上,这是最接近 Rive 状态机思路的原生方案——一个 targetState 变了,位移、缩放、透明度、颜色一起过渡。 共享元素用 SharedTransitionLayout + Modifier.sharedElement,Android 14 以上效果稳,低版本要有降级方案。 手势跟随用 Animatable 的 snapTo + animateTo,或者 Modifier.pointerInput 里手动算速度,再用 splineBasedDecay 做惯性。 曲线的核心是别到处写 tween(300)。建一个统一的动效 token 文件,比如 durationShort = 200ms、durationMedium = 300ms、easingStandard = CubicBezierEasing(0.2f 0f 0f 1f),回弹用 spring(dampingRatio = 0.6f stiffness = Spring.StiffnessMediumLow)。多邻国那种手感基本就是 200-300ms 加轻微 overshoot,spring 比 tween 更像。 角色和复杂特效那一层,Compose 有官方 runtime。Rive 有 KMP 支持,用 rive-android / rive-runtime,把 StateMachine 的 input 绑到 Compose 的 state 上就行。如果设计端用的是 AE,Lottie Compose 走纯播放,别指望它做交互。 帧预算这块 Compose 有个坑要注意:动画期间别在 composable 里做重建开销大的事,比如在 animate 的 lambda 里读的对象要是 stable 的,或者在 Modifier.graphicsLayer 里做变换而不是改布局参数,后者会触发 remeasure。列表里大动画尽量用 graphicsLayer 的 translation/scale,绕开重组。 触觉反馈用 HapticFeedback 或者 LocalView.performHapticFeedback,配合动画起点触发,比如点击瞬间给 TextHandleMove。 想更接近多邻国的话,下一步最值的是把状态收敛成枚举——loading、idle、success、fail、urgent 之类,所有动效都由这个枚举驱动,设计稿和代码共用一套。这一步做完,剩下的都是调参数。 需要我给一个具体的 updateTransition 加 spring 的可跑示例吗,比如按钮点击带 overshoot 和触觉的那种?