一:阅读资料
- Shared Element(共享元素)的使用
- 官方 共享元素git与使用pair的模板写法
- pair保存的是一对key value,而map可以保存多对key value。map中可以将pair加进去。所以普通intent传递pair即可。
二:Bug场景
- 在项目中使用共享元素动画,在点击之后在开始动画/结束动画时会存在一个偏移量,我这边是下移,并且删除得只剩一个imageview,改变RecycleView的layoutManager模式仍然不生效。
- 堆栈异常上也有人遇见这个问题 不过他还没解决
三:用我的塑料英语回答了一下
- 尝试了迁移发现,正常的ok,移到项目里就不中了。简单的来说就是主题文件里的全屏被开了,估计考虑到上面的状态栏有一定的高度站位偏移。
四:兼容全屏的解决方案
1. 在跳转后的活动中监听共享元素动画,设置非全屏,但仍有缺陷,切换动画正常,但在切换的一瞬间/大概1,2s会出现顶部通知栏。
window.sharedElementEnterTransition.addListener(object : Transition.TransitionListener {
override fun onTransitionStart(transition: Transition?) {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
override fun onTransitionEnd(transition: Transition?) {
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
override fun onTransitionCancel(transition: Transition?) {}
override fun onTransitionPause(transition: Transition?) {}
override fun onTransitionResume(transition: Transition?) {}
})
五:其他资料
1、 做共享元素动画时,当View大小不一致时,只需在二级页面指定 (推荐两个都写).override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL),该属性为glide下的方法与Target(原图的长和宽),区别在于如果不加存储bitmap按照调整后的view存储,加了按原图存储。
2、共享元素相关
val activityOptions = activity?.let {
ActivityOptionsCompat.makeSceneTransitionAnimation(
it,
Pair<View, String>(view, 元素唯一标志名)
)
}
- 共享元素监听,监听非常重要addlistener一定要移除对应的,不然每次都add一个,非常危险!
- 共享元素实现大图浏览,即recycleView到ViewPager共享动画setExitSharedElementCallback(及整合高仿微信大图查看,拖拽退出)
1)若在fragent中要调用activity不然无效,且会有android和androidx参数的操作。核心在于清空原本的标志名,建立新标志名。
- CardView上具有半径的共享元素过渡
- setExitSharedElementCallback