如何在Activity转场中执行淡入淡出动画?

97

我正在为我的标志活动和主活动之间编写转换效果,但我遇到一个问题,在消失之前,活动会移动到顶部:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false" >

    <alpha
        android:duration="2000"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" >
    </alpha>

</set>

我该如何改进这段代码,以获得只有消失效果?

4个回答

262
你可以创建自己的 .xml 动画文件来实现淡入一个新的 Activity 并淡出当前的 Activity:
fade_in.xml
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
           android:interpolator="@android:anim/accelerate_interpolator"
           android:fromAlpha="0.0" android:toAlpha="1.0"
           android:duration="500" />

淡出效果的XML文件。

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
           android:interpolator="@android:anim/accelerate_interpolator"
           android:fromAlpha="1.0" android:toAlpha="0.0"
           android:fillAfter="true"
           android:duration="500" />

在代码中使用它,类似这样:(在您的Activity内部)


Intent i = new Intent(this, NewlyStartedActivity.class);
startActivity(i);
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);

以上代码将淡出当前活动的Activity,并淡入新启动的Activity,从而实现平滑过渡。

更新:@Dan J指出,使用内置的Android动画可以提高性能,在进行一些测试后我确实发现了这一点。如果您喜欢使用内置的动画,请使用:

overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);

请注意,我引用android.R而不是R来访问资源ID。

更新: 现在通常使用在API级别19中引入的Transition类执行过渡效果。


67
使用内置的Android动画似乎可以得到更平滑的过渡效果:overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout); 查看这些文件还可以为您提供如何改进自定义动画的提示(例如通过使淡入比淡出持续时间更长来实现)。 - Dan J
42
它有一个下划线:overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); :) - AlvaroSantisteban
19
有一种选项是不需要“覆盖”: Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(), android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); startActivity(intent, bundle); (该选项允许使用自定义动画启动活动,而无需覆盖默认的活动转换动画。) - oleynikd
1
上述转换仅在开发者选项中启用时执行,请参见https://dev59.com/cnA75IYBdhLWcg3wRWsU#30422015。 - CoolMind
如果我只想要淡出效果,而不需要淡入效果,那么fade_in应该传递什么值? - ATP
显示剩余3条评论

27

只是重新发布oleynikd的答案,因为它简单而整洁。

Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(),
    android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); 
startActivity(intent, bundle);

在按下返回按钮的同时实现动画效果,

override fun onNavigateUp(): Boolean {
    return super.onNavigateUp()
    overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)
}

override fun onBackPressed() {
    super.onBackPressed()
    overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)

1
由于在某些手机上overridePendingTransition无法正常工作,而Enes的方法也不是很好,所以这个答案应该是正确的。 - Hugo Passos
它可以用于启动活动,但如何返回(完成)活动呢? - Adam Noor
请查看更新后的答案。 - Nikhil

21

你也可以在你的style.xml文件中使用这段代码,这样你就不需要在你的activity.java中编写其他内容了。

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowAnimationStyle">@style/AppTheme.WindowTransition</item>
</style>

<!-- Setting window animation -->
<style name="AppTheme.WindowTransition">
    <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
    <item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>

在SDK 24中无法工作。 - undefined

19

您可以在您的活动中使用以下方法在 onCreate 方法中添加动画,因为 overridePendingTransition 在某些手机上不能正常工作,或者取决于设备设置...

View view = findViewById(android.R.id.content);
Animation mLoadAnimation = AnimationUtils.loadAnimation(getApplicationContext(), android.R.anim.fade_in);
mLoadAnimation.setDuration(2000);
view.startAnimation(mLoadAnimation);

1
如何处理前一个或父活动的动画? - Mehmed
10
要设置返回到父活动的过渡动画,请使用以下代码:`@Override public void onBackPressed() { super.onBackPressed(); overridePendingTransition(R.anim.fade_in, R.anim.fade_out); }` - John Verco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接