如何在“活动”过渡上执行淡入淡出动画?


89

我正在整理徽标活动和主活动之间的过渡效果,但是我遇到的问题是,活动消失之前移至顶部:

<?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>

我如何才能改善此代码,以使其消失?

Answers:


236

您可以创建自己的.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" />

fade_out.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类执行转换。


65
使用内置的Android动画似乎可以使过渡更加平滑:overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout);查看这些文件还可以提示您如何改善自定义动画(例如,使上一次淡入的时间长于淡出的时间)。
Dan J

41
它具有overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
undescore

我是否必须在onCreate或每个Intent中使用overridePendingTransition?还是取决于我想要什么?谢谢。
里卡多

19
有一个选项不包含“覆盖”:Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(), android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); startActivity(intent, bundle);
oleynikd

1
仅当在开发人员选项中启用了以上转换时,请执行此操作,请参阅stackoverflow.com/a/30422015/2914140
CoolMind

22

只需重新发布 oleynikd的答案,因为它既简单又整洁

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

由于overridePendingTransition在某些手机中不起作用,并且Enes的解决方案不是很好,因此此答案应该是正确的。
雨果·帕索斯

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 2014年

9
要设置过渡到父级活动的动画,请使用以下代码: @Override public void onBackPressed() { super.onBackPressed(); overridePendingTransition(R.anim.fade_in, R.anim.fade_out); }
John Verco 2014年

15

您还可以在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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.