Android 共享元素动画,返回时会闪一下的问题

造成的原因是因为在返回时onResume方法会进行一个共享元素的Alpha赋值,会先赋值为0,再到1,所以会有明显的闪屏。

 

修改方式:

在闪屏页面添加callback

setExitSharedElementCallback(new TransitionCallBack());

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class TransitionCallBack extends SharedElementCallback {

    @Override
    public Parcelable onCaptureSharedElementSnapshot(View sharedElement, Matrix viewToGlobalMatrix, RectF screenBounds) {
        sharedElement.setAlpha(1);
        return super.onCaptureSharedElementSnapshot(sharedElement, viewToGlobalMatrix, screenBounds);
    }
}

就不会在闪屏了。

 

具体分析参考:

https://www.jianshu.com/p/7664527930e1

A: 可以使用共享元素转场动画实现这种效果。具体步骤如下: 1. 在两个 Activity 中选定相同的 View 作为共享元素,设置相同的 transitionName。 ```xml <!--activity1--> <ImageView android:id="@+id/shared_element" android:transitionName="shared_element"/> <!--activity2--> <ImageView android:id="@+id/shared_element" android:transitionName="shared_element"/> ``` 2. 在启动 Activity2 时,设置共享元素的转场动画。 ```kotlin // activity1 val intent = Intent(this, Activity2::class.java) // 设置共享元素的转场动画 val options = ActivityOptions.makeSceneTransitionAnimation(this, sharedElement, "shared_element") startActivity(intent, options.toBundle()) ``` ```xml // activity2 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity2) // 设置共享元素的转场动画 ViewCompat.setTransitionName(sharedElement, "shared_element") // 延迟进入动画,等待布局完成 window.decorView.postDelayed({ startEnterAnimation() }, 100) } private fun startEnterAnimation() { val enterAnimation = AnimationUtils.loadAnimation(this, R.anim.translate_in_from_right_bottom) enterAnimation.duration = 500 sharedElement.startAnimation(enterAnimation) } ``` 3. 在 Activity2 中,在退出时设置返回动画,并在动画结束后调用 `finish()` 方法。 ```kotlin override fun onBackPressed() { // 设置返回动画 val exitAnimation = AnimationUtils.loadAnimation(this, R.anim.translate_out_to_left_top) exitAnimation.duration = 500 sharedElement.startAnimation(exitAnimation) // 在动画结束后调用 finish() 方法 exitAnimation.setAnimationListener(object : Animation.AnimationListener { override fun onAnimationStart(animation: Animation?) {} override fun onAnimationEnd(animation: Animation?) { finishAfterTransition() } override fun onAnimationRepeat(animation: Animation?) {} }) } ``` 对应的动画资源文件 `translate_in_from_right_bottom.xml` 和 `translate_out_to_left_top.xml` 可以自己定义,这里提供一组示例: ```xml <!--translate_in_from_right_bottom.xml--> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="500" android:fromXDelta="100%p" android:fromYDelta="100%p"/> <!--translate_out_to_left_top.xml--> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="500" android:toXDelta="-100%p" android:toYDelta="-100%p"/> ``` 运行效果如下: ![](https://img-blog.csdnimg.cn/2022011319273689.gif#pic_center)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值