共享控件¶
简单共享元素¶
使用共享元素时,只需在两个页面中使用Element
函数将共享的元素起来,两者使用相同的key,然后在route
时设置transform=share(key)
,只有share
指定的key的共享元素才会共享。
//page1
Button(onClick={
pageScope.route("page2"){
transform = share("ele_key")
}
})
Element("ele_key"){
//code...
}
//page2
Element("ele_key"){
//code...
}
share
方法中指明即可,没有指明的Element将不执行共享(和普通的控件没有区别)ele_key
是唯一键,指定两个页面的元素是否共享,以及在一次页面路由中有哪些共享元素参与变换。而唯一键可以是任意类型,建议使用data class,枚举或字符串
共享元素内部变换¶
上述是简单的共享元素使用,当你需要共享元素内部的样式也需要在共享过程中进行变换,比如希望共享元素的背景颜色可以顺滑的过渡,那么需要进阶一下。
//page1
Button(onClick={
pageScope.route("page2"){
transform = share("ele_key")
}
})
Element("ele_key",styles=listOf(Color.Red)){
val bgColor by getStyle(0, animate = animateColor())
//code...
}
//page2
Element("ele_key",styles=listOf(Color.Blue)){
val bgColor by getStyle(0, animate = animateColor())
//code...
}
bgColor
即可。除了color,还支持Int,Offset等多种值,如果有特殊的值,可使用animateValue
方法进行自定义。
当需要共享元素内部变换响应手势,只需要给getStyle
方法设置sharing即可:
val bgColor by getStyle(0,sharing = ::sharing, animate = animateColor())
更新共享元素¶
当存在多个共享元素时,以A共享元素进入,可以通过更新共享元素使得可以使用B共享元素退出。
//page2
updateElement("label")
//page1
onUpdateElement{
//code...
}
updateElement
方法即可替换当前使用的共享元素,如果替换的共享元素并未找到,那么将会通过onUpdateElement
回调方法通知给前一个页面,让其准备好。
官方的共享元素。¶
在我编写MRouter的时候官方是还没有推出共享元素的,但是到现在,官方已经推出了,是两种不同的实现,待官方的稳定之后也会考虑集成进来。官方的共享元素。