什么的枝干| 伤到什么程度打破伤风| 什么可以代替狗狗沐浴露| 小手指麻木是什么原因引起的| 北宋六贼为什么没高俅| 财大气粗是什么意思| 类胡萝卜素主要吸收什么光| 直视是什么意思| 傲娇什么意思| 什么颜色加什么颜色等于白色| 五行属火适合什么行业| 做梦流产了是什么意思| 天天都需要你爱是什么歌| 真丝丝绒是什么面料| 染色体是什么意思| 白介素6升高说明什么| 硫酸铜什么颜色| 胃凉是什么原因| 光阴荏苒是什么意思| 软科是什么意思| 肋骨骨折挂什么科| 什么是血沉| 鼻窦炎吃什么药效果好| 土豆发芽到什么程度不能吃| 激素6项什么时候查| 大姨妈推迟什么原因| 春晓的晓是什么意思| 什么时候建档| 两色富足间是什么生肖| 黑松露是什么东西| 心梗是什么症状| 姓丁的女孩起什么名字好| rhd血型阳性是什么意思| 拔牙有什么危害| 天上的月亮是什么生肖| 急支糖浆是什么梗| 小三什么意思| 脂肪肝吃什么药效果好| 流鼻血看病挂什么科| 少一个睾丸有什么影响| 凌志和雷克萨斯有什么区别| 一个益一个蜀念什么| 化作风化作雨是什么歌| 加是什么生肖| 日本什么时候开始侵略中国| 沙棘对肝脏有什么好处| 覆盆子有什么功效| 经常掉头发是什么原因| 偏科是什么意思| 什么秒必争| 张靓颖什么星座| 什么是口爆| wrong什么意思| 金牛男喜欢什么样的女生| 香肠炒什么好吃| 屁股两边疼是什么原因| 甘油脂肪酸酯是什么| 胆固醇高应注意什么| 为什么晚上不能照镜子| 什么炖鸡汤好喝又营养| 拉肚子喝什么| 低血糖中医叫什么病| 水痘长什么样子| onemore是什么牌子| 无药可救是什么意思| 能力是什么| 为什么不建议做冠脉cta检查| 你真狗是什么意思| 父母坟上长树意味什么| 被迫是什么意思| 9月3号是什么星座| 血糖高适合吃什么蔬菜| 宫内积液什么意思| lee是什么牌子| 太阳穴长痘是什么原因| 尿检ph值偏高说明什么| kkb什么意思| 入赘什么意思| 针眼长什么样子图片| 脾脏是人体的什么器官| 结膜炎是什么病| 人外是什么意思| dunhill是什么品牌| 3月14号是什么星座| 脉压是什么意思| 花儿为什么这样红简谱| 总做梦是什么原因| 吃月饼是什么生肖| 巴适什么意思| 做空是什么意思啊| 铁蛋白低吃什么可以补| 亚麻籽是什么| 369是什么意思啊| 土豆什么时候种植| 7.17是什么日子| aurora是什么牌子| 羊胡子疮用什么药膏| 妇科炎症用什么药| 什么是肾功能不全| 为什么会得多囊| 魔术贴是什么| 大便有血是什么原因男性| 什么水果是降火的| 内分泌失调吃什么调理| timing是什么意思| 玻璃属于什么垃圾| 大黄和芒硝混合外敷有什么作用| 下肢肿胀是什么原因| psp是什么| 甲减是什么原因引起的| 医学ns是什么意思| 富三代是什么意思| 吃什么可以长头发| 什么是遗精| 男士内裤买什么牌子好| 肌酸什么时候喝| 意象是什么意思| 来例假腰疼是什么原因| 果脯是什么东西| 人中附近长痘痘什么原因| 口腔溃疡喝什么| pretty什么意思| 妙赞是什么意思| 妖股是什么意思| 广东省省长什么级别| 女人吃什么补肾| 六月二十九日是什么星座| 炸油条用什么油最好| 鹿鞭泡酒有什么功效| 婴儿黄疸母亲忌口什么| r一谷氨酰转移酶高说明什么| 肾盂肾炎吃什么药| 林黛玉是什么病| 胎盘是什么| 梦到自己拉大便是什么预兆| 什么的态度| 生育能力检查挂什么科| 厥是什么意思| 友谊是什么意思| 沙拉是什么意思| 歇斯底里什么意思| 大小休是什么意思| 尿骚味重是什么原因| 咳嗽发烧吃什么药| 糖蛋白是什么| 夏天适合吃什么水果| luxury是什么牌子| 政协主席什么级别| 关心则乱是什么意思| 外阴瘙痒用什么效果好| 记忆力差是什么原因| 人为什么会哭| 血脂高吃什么油| 自然人是什么意思| 梦见着火是什么意思| 结肠和直肠有什么区别| 为什么叫买东西不叫买南北| 女生两个月没来月经是什么原因| 铂金是什么材质| 4.22什么星座| 腰扭伤吃什么药最有效| 八月十日是什么星座| 瘴气是什么意思| 家庭主妇是什么意思| 因果循环是什么意思| 什么血型| 1969年属什么生肖| 胸闷挂什么科室| 体检喝水了有什么影响| 腹股沟在什么位置| 梦到知了猴是什么意思| 爬灰什么意思| 流涎是什么意思| 肠道紊乱有什么症状| 什么知什么明| 369是什么意思| 牛油果有什么功效| 糖尿病可以吃什么菜| 低烧是什么症状和感觉| 89年的属什么| 良善是什么意思| 硕的拼音是什么| 网红是什么意思| 猫喜欢吃什么| 一语道破什么意思| 蜘蛛痣长什么样| 肝胃郁热吃什么中成药| 生日礼物送什么| 克是什么意思| 数字2代表什么意思| 婀娜多姿是什么动物| 梦见自己死了又活了是什么意思| phonics是什么意思| 逍遥丸治什么病| 白带发绿是什么原因| 尼姑是什么生肖| pose什么意思| 子宫肌瘤是什么症状| 党参泡酒有什么功效| o型血与b型血生的孩子是什么血型| 较前相仿是什么意思| 与生俱来是什么意思| 糖链抗原高是什么原因| 脚心热吃什么药| 什么是造口| 脑梗什么不能吃| 7月12日什么星座| 肥胖纹长什么样| 什么叫做流年| 手筋痛是什么原因| 马杀鸡是什么意思| 前列腺挂什么科| 小狗的尾巴有什么作用| 眼睛肿疼是什么原因引起的| 什么颜色混合是红色| 右眼皮跳是什么预兆女| 什么是靶向药| 17点到19点是什么时辰| 佛道是什么意思| 数字化摄影dr是检查什么| 天梭手表属于什么档次| 月子餐第一周吃什么| 跑步什么时候跑最好| 抖腿是什么毛病| 茄子与什么食物相克| 眼珠子发黄是什么原因| 总爱放屁是什么原因| 颈椎反弓有什么症状| 竟然是什么意思| 胃底腺息肉什么意思| 229什么星座| 芒果不可以跟什么一起吃| 做梦梦见老婆出轨是什么意思| 岚字五行属什么| 广西古代叫什么| 画蛇添足的故事告诉我们什么道理| 鹦鹉吃什么蔬菜| 小狗打什么疫苗| 孩子脾虚内热大便干吃什么药| 什么止痛药效果最好| 大头瘟现代叫什么病| 平产是什么意思| pick什么意思| 温存是什么意思| 人体的三道防线是什么| 蓝色加什么颜色是紫色| 戊午五行属什么| 上元节是什么节日| hr过高是什么意思| 发热吃什么药| 烫伤擦什么药膏| 肺气肿是什么| 女生下体长什么样子| pr什么意思| 执拗是什么意思| 被舔是什么感觉| 保泰松是什么药| 一起共勉是什么意思| 冷战是什么意思| 骁字五行属什么| 什么植物和动物最像鸡| 糜烂型脚气用什么药| 珍珠翡翠白玉汤是什么| 核磁共振和ct有什么区别| 百度

(信息)道简心康心血管康复医生集团成立

百度 1992年起获政府特殊津贴。

原生 App 中我们常见到这样的交互,如从商品列表页进入详情页过程中,商品图片在页面间飞跃,使得过渡效果更加平滑,另一个案例是朋友圈的图片预览放大功能。在 Skyline 渲染模式下,我们称其为共享元素动画,可通过 share-element 组件来实现。

在连续的 Skyline 页跳转时,页面间 key 相同的 share-element 节点将产生飞跃特效,开发者可自定义插值方式和动画曲线。通常作用于图片,为保证动画效果,前后页面的 share-element 子节点结构应该尽量保持一致。

# 立即体验

扫码打开小程序示例,交互动画 - 基础组件 - 共享元素动画 即可体验。

# 使用方法

属性 类型 默认值 必填 说明 最低版本
key string 映射标记,页面内唯一 2.29.2
transition-on-gesture boolean false 手势返回时是否进行动画 2.29.2
shuttle-on-push string to 指定 push 阶段的飞跃物 2.30.2
shuttle-on-pop string to 指定 pop 阶段的飞跃物 2.30.2
rect-tween-type string materialRectArc 动画插值曲线 2.30.2
on-frame worklet callback 动画帧回调 2.30.2

假定 A 页和 B 页存在对应的 share-element 组件

  1. push 阶段:通过 wx.navigateToA 进入 B,称 A 为源页面(from 页),B 为目标页(to 页)
  2. pop 阶段:通过 wx.navigateBackB 返回 A,此时 B 为源页面 (from 页), A 为目标页(to 页)

# 指定飞跃物

开发者可以指定选定源页面或目标页的 share-element 作为飞跃物。

由于涉及两个页面的组件,这里以目标页 share-element 组件指定的属性为准

  1. push 阶段:默认采用 B 页的 share-element 组件进行飞跃,设置属性 shuttle-on-push=from 可切换成 A 页的。
  2. pop 阶段:默认采用 A 页的 share-element 组件,设置属性 shuttle-on-pop=from 可切换成 B 页的。

需注意的是 on-frame 回调总是在指定为飞跃物的 share-element 组件上触发。

# 动画帧回调

共享元素动画就是以源页面 share-element 所在矩形框为起点,目标页 share-element 所在矩形框为终点,进行插值计算的过程,动画时长与页面路由时间一致。

enum FlightDirection {
  push = 0,
  pop = 1
}

interface Rect {
  top: number,
  right: number,
  bottom: number,
  left: number,
  width: number,
  height: number
}

interface ShareElementFrameData {
  // 动画进度,0~1
  progress: number,
  // 动画方向,push | pop
  direction: FlightDirection
  // 源页面 share-element 容器尺寸
  begin: Rect,
  // 目标页 share-element 容器尺寸
  end: Rect,
  // 由框架计算的当前帧飞跃物容器尺寸
  current: Rect,
}

type ShareElementOnFrameCallback = (data: ShareElementFrameData) => undefined | Rect

开发者可通过 on-frame 回调来自定义插值方式。ShareElementFrameData 中包含了始末位置,以及框架按照指定的动画曲线 rect-tween-type 和当前进度 progress 计算的 current 位置。

默认插值方式为对 RectLTWH 分别进行线性插值。当 on-frame 返回 undefined 时,当前帧飞跃物的实时位置由 current 决定,开发者可返回按其他方式计算的 Rect 对象进行改写。

const lerp = (begin: number, end: number, t: number) => {
  'worklet'
  return begin + (end - begin) * t
}

const lerpRect = (begin: Rect, end: Rect, t: number) => {
  'worklet'
  const left = lerp(begin.left, end.left, t);
  const top = lerp(begin.top, end.top, t);
  const width = lerp(begin.width, end.width, t);
  const height = lerp(begin.height, end.height, t);
  const right = left + width
  const bottom = top + height

  return {
    left,
    top,
    right,
    bottom,
    width,
    height
  }
}

# 动画插值曲线

除了可以自定义插值方式外,还可以自定义动画曲线,默认的动画曲线为 cubic-bezier(0.4, 0.0, 0.2, 1.0),记作 fastOutSlowIn

rect-tween-type 设置为如下类型时,默认的插值方式为对 RectLTWH 分别进行线性插值

此外,rect-tween-type 还支持两类特殊的枚举值,对于这两个值,动画曲线仍是 fastOutSlowIn,但插值方式有所不同,运动轨迹为弧线。

  • materialRectArc:矩形对角动画
  • materialRectCenterArc:径向动画

# 工作原理

下面以 push 过程为例介绍共享元素动画的各个阶段。

注意:实际上动画过程中 share-element 节点自身不进行动画,移动的是其子节点。

# 动画开始前

目标页还未渲染,在所有页面之上创建 overlay 层,飞跃物将在 overlay 层进行动画。

# 动画开始时刻

调用 wx.navigateTo 推入新页面时动画触发,progress = 0 时刻发生如下动作

  1. 目标页首帧渲染,框架计算出目标 share-element 节点位置大小。
  2. share-element 节点离屏(不显示)。
  3. 将目标 share-element 节点移至 overlay 层,作为飞跃物,位置大小同源 share-element 节点。

# 动画过程中

根据指定的插值方式和动画曲线,目标 share-elementoverlay 层进行动画,从起点向终点位置过渡。

# 动画结束时刻

progress = 1 时刻,将目标 share-elementoverlay 层移动到目标页面,出现在终点位置。

# 注意事项

  • Skyline 版本 share-element 无需结合 page-container 使用
  • share-element 组件设置 paddingjustify-content 等影响子节点布局的样式将无法生效
  • 可结合页面生命周期 onRouteDone 在路由完成时刻做一些状态恢复工作

# Q & A

# Q1: 设置了相同的 key,但没有看到飞跃动画

共享元素动画需保证下一个页面首帧即创建好 share-element 节点,并设置了 key,用于计算目标位置。

如果是通过 setData 设置的,可能会错过首帧。针对这种情况,可以 使用 Component 构造器构造下一个页面,只要在组件 attached 生命周期前(含)通过 setData 设置上去,就会在首帧渲染。

# Q2: 飞跃过程中,子节点不会跟随放大/缩小

动画过程中,飞跃物容器会不断变化大小和位置,如果子节点想自适应跟随变化,就需要通过百分比布局,而非写死固定宽高。

<!-- 由于子 view 固定大小,飞跃过程中仅位置发生变化,大小不变 -->
<share-element key="portrait">
  <view style="width: 50px; height: 50px;"></view>
</share-element>


<!-- 由于子 view 设置跟父节点一样大,飞跃过程中位置、大小均会改变 -->
<share-element key="portrait" style="width: 50px; height: 50px;">
  <view style="width: 100%; height: 100%;"></view>
</share-element>

# Q3: 多个 share-element 一起动画,覆盖层级问题

飞跃物在 overlay 层进行动画,层级在所有页面之上。飞跃物间按其在页面组件树的定义顺序(DFS 遍历),越往后的层级越高。

# Q4: 自定义路由手势返回时,未看到返回动画

首先须给组件设置 transition-on-gesture=true 属性。同时自定义路由手势返回时,只有调用 startUserGesture 接口后才会触发共享元素动画。

# Q5: 共享元素动画与路由动画关系

共享元素跟随页面路由动画一同开始和结束。如果设置自定义路由的页面进入曲线和 rect-tween-type 一致,则 onFrame 返回的 progress 值也与 PrimaryAnimation.value 的值始终保持一致。

# 示例用法

# 基础用法

商品列表页

<block wx:for="{{list}}" wx:key="id">
  <share-element key="box" transition-on-gesture>
    <image
    src="{{src}}"
    mode="aspectFill"
    />
  </share-element>
</block>

商品详情页

<share-element key="box" transition-on-gesture>
  <image
  src="{{src}}"
  mode="aspectFit"
  />
</share-element>

示例代码片段-基础

可在开发者工具中体验效果,这里需要注意图片 mode 不同带来的影响。

# 进阶用法

以仿朋友圈图片预览放大功能为例,介绍通过帧回调解决图片 mode 不同带来的跳变问题。相关功能已封装成 aniamted-image 组件,开发者可在此基础上进行修改。

这里简要介绍核心思路:

  1. 始终以 listshare-element 为飞跃物
  2. 通过 on-frame 改写飞跃物容器的位置大小,使其充满 overlay
  3. 以图片实际占据空间确定始末容器的位置大小,而不是 share-element 节点占据的空间
  4. 飞跃过程中使用缩略图,高清图下载完成后进行替换

默认计算方式,以 share-element 节点占据空间确定始末位置,会产生跳变。

以图片实际占据空间确定始末位置,始终采用单一 mode 效果,不会产生跳变。

使用最新 nightly 工具预览,移动端安卓 8.0.33 版本。

示例代码片段-进阶

宫颈柱状上皮外移是什么意思 次胖是什么意思 白玉菩提是什么材质 李子不能和什么一起吃 五月21号是什么星座
黄瓜与什么食物相克 一个立一个羽是什么字 辟谷有什么好处 梦见老牛是什么意思 夫妻合葬有什么讲究
吃什么食物帮助睡眠 股票填权是什么意思 睡着后抽搐抖动是什么 犹太是什么意思 开业送什么礼物好
县委办公室主任是什么级别 鼠的本命佛是什么佛 没有什么就没有发言权 17数字代表什么意思 痹症是什么意思
八月有什么节日hcv9jop1ns3r.cn 糖尿病病人吃什么水果hcv8jop9ns8r.cn 橙色加绿色是什么颜色hcv9jop3ns2r.cn 香港奶粉为什么限购hcv8jop7ns7r.cn tvt是什么意思hcv9jop5ns1r.cn
12月10日什么星座hcv8jop9ns9r.cn ca199是什么检查项目hcv8jop3ns6r.cn 脱髓鞘疾病是什么病hcv9jop4ns7r.cn 翻墙软件是什么hcv7jop9ns5r.cn 面线是什么hcv9jop8ns2r.cn
胸口有痣代表什么意思hcv9jop8ns0r.cn mic是什么意思hcv8jop3ns0r.cn 芝柏手表什么档次hcv8jop2ns3r.cn 金骏眉茶是什么茶jingluanji.com 蛇的贵人是什么生肖hcv8jop6ns9r.cn
继发性高血压是什么意思hcv9jop8ns0r.cn 胆固醇偏高是什么原因hcv9jop1ns6r.cn 为什么辰不能见亥hcv9jop5ns8r.cn 耳鬓厮磨是什么意思sanhestory.com 什么病需要做手术hcv8jop8ns4r.cn
百度