android:gravity=“center”
android:transitionName=“textTransform”
android:text=“我是第一个Activity”
android:textColor="@color/c_333"
android:textSize=“18sp” />
`
- 构建多个
Pair
对象,并传递给makeSceneTransitionAnimation()
函数,启动Activity
。
ivImage.setOnClickListener { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { val imagePair=Pair<View,String>(ivImage,"activityTransform") val textPair=Pair<View,String>(ivImage,"textTransform") val bundle = ActivityOptions.makeSceneTransitionAnimation(this, imagePair,textPair).toBundle() startActivity(Intent(this, SecondActivity::class.java), bundle) } else { startActivity(Intent(this, SecondActivity::class.java)) } }
这里主要是通过将共享视图和transitionName
属性的值包装到Pair
对象,其他操作和一个共享元素的操作步骤并无区别。
「效果图:」
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z8X4C3b8-1650171556284)(https://user-gold-cdn.xitu.io/2020/7/11/1733cfa764aa491f?imageslim)]
「深坑提醒」
有时从RecyclerView
界面进入到详情页,由于详情页加载延迟,可能出现没有效果。例如ImageView
从网络加载图片,可能A界面到B界面没效果,B回到A界面有效果。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H8wLsO5B-1650171556284)(https://user-gold-cdn.xitu.io/2020/7/13/173473efe2c8292e?imageslim)] 解决步骤:
- 在
setContentView
后添加下面代码,延迟加载过渡动画。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { postponeEnterTransition() }
- 在共享元素视图加载完毕,或者图片加载完毕后调用下面代码,开始加载过渡动画。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { startPostponedEnterTransition() }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qOjjyeXL-1650171556285)(https://user-gold-cdn.xitu.io/2020/7/13/173473cc8f694a47?imageslim)] 例如我是在Glide加载完再调用:
Glide.with(mContext) .asBitmap() .load(value?.avatar ?: "") .listener(object : RequestListener<Bitmap> { override fun onResourceReady(resource: Bitmap?, model: Any?, target: Target<Bitmap>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean { animatorCallback?.invoke()//回调